按数组内对象的两个值过滤 mongoengine/mongodb-query 中的项目

Filter items in mongoengine/mongodb-query by two value of an object inside an array

我想筛选一个包含对象数组的 JSON 对象(在集合中,称为 chat)。该对象包含两个值,leaveduser。我想过滤两者,所以我只得到两个值匹配的那些集合实体。

示例 chat 条目:

{
    "_id" : ObjectId("5de8529e104e1be853907372"),
    "created_at" : ISODate("2019-12-05T00:42:35.000Z"),
    "closed" : false,
    "type" : "group",
    "creator" : ObjectId("5da976ed390587ad999e0190"),
    "messages" : [],
    "members" : [ 
        {
            "leaved" : true,
            "user" : ObjectId("5da9773c0e46aa734e4c3683")
        }, 
        {
            "leaved" : false,
            "user" : ObjectId("5dceca90ab5d5c16a7401df0")
        }
    ]
}

当我现在尝试按 leaveduser 进行过滤时,就像在 mongoengine 中这样,我得到了上述值,但我应该得到 none.

id = "5da9773c0e46aa734e4c3683"
chats = Chat.objects.filter(members__user=id, members__leaved=False)

如果有人知道如何在 MongoDBjs 中做到这一点,那太好了,我可以自己调整它以适应 mongoengine。 :) 这就是我标记两者的原因

看来我找到答案了,多亏自己睡了一觉 x(

id = ObjectId("5dceca90ab5d5c16a7401df0")
db.getCollection('chat').find({ 
    "$or": [
        {
            "members": { 
                "$elemMatch": { 
                    "leaved": false,
                    "user": id
                } 
            }
        },
        {
            "creator": id,
            "closed": false
        }
    ] 
})

我会再测试一下,然后针对 mongoengine 版本编辑此 post。之后我将其标记为已解决,如果没有人比我快的话:)

编辑:

真快...:[=​​13=]

chats = Chat.objects.filter(
    Q(members__match={"leaved": False, "user": id}) | Q(creator=id, closed=False)
)