【发布时间】:2020-02-11 00:46:27
【问题描述】:
我有一个这样的数据集:
{
"_id" : ObjectId("5da028f8926a6200f408e531"),
"content" : [
"hello world"
],
"set" : [
{
"setA" : [
{
"userid" : "5c35f1045643180d9488112f",
},
{
"userid" : "5c35f1045643180d9488112g",
}
],
"timestamp" : ISODate("2019-10-14T07:07:44.036Z"),
"id" : ObjectId("5da41ec053fce70ab03b9c18")
},
{
"setA" : [
{
"userid" : "5c35f1045643180d9488112g",
}
],
"timestamp" : ISODate("2019-10-14T07:07:37.470Z"),
"id" : ObjectId("5da41eb953fce70ab03b9c16")
},
{
"setA" : [],
"timestamp" : ISODate("2019-10-14T07:07:29.454Z"),
"id" : ObjectId("5da41eb153fce70ab03b9c14")
}
],
"secondset": [
{
"userid" : "5c35f1045643180d9488112f",
},
]
"__v" : 0,
}
现在我想搜索 setA 数组上是否存在用户 ID
我有点困惑如何编写查询。
如果这种情况在secondset 数组上,那么我知道如何检查。像这样的查询:
db.CollectionName.findOne(
{ _id: ObjectId("5da028f8926a6200f408e531") },
{ secondset: { $elemMatch: { userid: req.body.userid } }
)
通过此查询,如果用户标识存在则返回用户标识,否则返回[]。 所以我可以进一步处理类似的条件
if (data.length > 0) {
//Already exist
} else {
//Not exist
//Do some stuff here
}
但我没有得到嵌套数组的响应。我写了查询但没有成功。查询是:
db.CollectionName.findOne(
{ _id: ObjectId("5da028f8926a6200f408e531"), "set.id": ObjectId("5da41eb953fce70ab03b9c16") },
{ "set.$.setA": { $elemMatch: { userid: "5c35f1045643180d9488112f" } }
)
使用此查询我收到错误,即Cannot use $elemMatch projection on a nested field.
有没有人可以指导我如何解决这个问题。非常感谢任何帮助或建议。
【问题讨论】:
-
我认为您可以将查询的过滤条件指定为
{ "set.setA.userid": "5c...g" }或{ "set.setA.userid": { $in: [ "5c...g", "xyz" ] } }。并将其与find或findOne方法一起使用。无需使用$elemMatch运算符(用于为同一字段指定多个条件)。另请参阅MongoDB manual - Query Arrays。和Query an Array of Embedded Documents。
标签: mongodb mongoose aggregation-framework