如何查找包含两个相等值的数组的文档?

时间:2019-06-26 01:25:14

标签: mongodb

我有与参与者数组聊天的集合

    [{
    "_id": ObjectId("5d12b2a10507cfe0bad6d93c"),
    "participants": [{
            "_id": ObjectId("5ce4af580507cfe0ba1c6f5b"),
            "firstname": "John",
            "lastname": "Anderson",
            "icon": "/assets/images/avatars/small/2.jpg"
        },
        {
            "_id": ObjectId("5ce4af580507cfe0ba1c6f5b"),
            "firstname": "John",
            "lastname": "Anderson",
            "icon": "/assets/images/avatars/small/2.jpg"
        }
    ]
}, {
    "_id": ObjectId("5d1124a50507cfe0baba7909"),
    "participants": [{
            "_id": ObjectId("5ce4af580507cfe0ba1c6f5b"),
            "firstname": "John",
            "lastname": "Anderson",
            "icon": "/assets/images/avatars/small/2.jpg"
        },
        {
            "_id": ObjectId("5ce54cb80507cfe0ba25d74b"),
            "firstname": "Milosh",
            "lastname": "Jersi",
            "icon": "/assets/images/avatars/small/3.jpg"
        }
    ]
}]

我通过 req.db.collection('chats').findOne({'participants._id': {$all: [req.userID, new mongo.ObjectID(req.params.to)]}}); 其中userID也是ObjectID并等于。

通常它具有不同的参与者,但是我们的用户还可以向自己发送消息,这在许多社交网络中都是允许的选项。 因此,在这种情况下,我们的用户“ John Anderson”向自己发送了消息,并为此插入了聊天文档。

现在我有问题,如何获取具有相等数组值的文档

{'participants._id': { '$all': [ 5ce4af580507cfe0ba1c6f5b, 5ce4af580507cfe0ba1c6f5b] }}
// return every chat contains our id in atleast one field, but we need both to be equal
// same for $in

{'participants._id': { '$eq': [ 5ce4af580507cfe0ba1c6f5b, 5ce4af580507cfe0ba1c6f5b] }}
// return nothing

我还能做什么?

1 个答案:

答案 0 :(得分:2)

您可以使用 $group 阶段通过聚合框架来实现。首先,按chat._id分组,并使用 $addToSet 将唯一身份的用户保留在一个新数组中,然后ant添加一个过滤器以仅保留一个参与者的文档:

db.collection.aggregate([
  {
    "$unwind": "$participants"
  },
  {
    "$group": {
      "_id": "$_id",
      "participants": {
        "$addToSet": "$participants._id"
      }
    }
  },
  {
    "$match": {
      "participants": {
        "$size": 1
      }
    }
  }
])

结果:

[
  {
    "_id": ObjectId("5d12b2a10507cfe0bad6d93c"),
    "participants": [
      ObjectId("5ce4af580507cfe0ba1c6f5b")
    ]
  }
]

您可以在线尝试:_rank_eval