检查对象嵌套数组上的用户标识是否存在

时间:2019-10-14 11:39:48

标签: mongodb mongoose aggregation-framework

我有一个像这样的数据集:

{
    "_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.

有人可以指导我如何解决此问题。任何帮助或建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

我们需要使用嵌套的$elemMatch

以下查询可以为我们提供预期的输出:

db.collection.find({
  "set":{
    $elemMatch:{
      "setA":{
        $elemMatch:{
          "userid" : "5c35f1045643180d9488112f"
        }
      }
    }
  }
}).pretty()