【问题标题】:check userid existance on nested array of object检查对象嵌套数组的用户标识是否存在
【发布时间】: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" ] } }。并将其与findfindOne 方法一起使用。无需使用$elemMatch 运算符(用于为同一字段指定多个条件)。另请参阅MongoDB manual - Query Arrays。和Query an Array of Embedded Documents

标签: mongodb mongoose aggregation-framework


【解决方案1】:

我们需要使用嵌套的$elemMatch

以下查询可以得到我们预期的输出:

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

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多