我有一个像这样的数据集:
{
"_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,
}
现在我要搜索用户ID是否存在于setA
数组中
我有点困惑如何编写查询。
如果这种情况在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.
有人可以指导我如何解决此问题。任何帮助或建议都非常感谢。
答案 0 :(得分:0)
我们需要使用嵌套的$elemMatch
。
以下查询可以为我们提供预期的输出:
db.collection.find({
"set":{
$elemMatch:{
"setA":{
$elemMatch:{
"userid" : "5c35f1045643180d9488112f"
}
}
}
}
}).pretty()