проверить наличие идентификатора пользователя на вложенном массиве объекта - PullRequest
1 голос
/ 14 октября 2019

У меня есть такой набор данных:

{
    "_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 или нет, я немного запутался, как написать запрос. Если этот случай на 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 голосов
/ 15 октября 2019

Нам нужно использовать вложенные $elemMatch.

Следующий запрос может дать нам ожидаемый результат:

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