【问题标题】:Filter items in mongoengine/mongodb-query by two value of an object inside an array通过数组内对象的两个值过滤 mongoengine/mongodb-query 中的项目
【发布时间】:2019-12-05 01:33:28
【问题描述】:

我想过滤一个包含对象数组的 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 中这样,我得到了上述值,但我应该没有。

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

如果有人知道如何在 MongoDBjs 中做到这一点,那太好了,我可以自己将其改编为 mongoengine。 :) 这就是我标记两者的原因

【问题讨论】:

  • 您可以为 ObjectID 和 ISODate 添加导入吗?
  • @oppressionslayer 你是什么意思?这是 mongodb json 而不是 python。我从收藏中复制了它。我认为架构及其创建方式是不必要的。我期待像..(members__user=id and members__leaved=False)
  • @oppressionslayer 稍微更新了我的问题,希望现在更清楚我需要什么。

标签: python mongodb mongodb-query mongoengine


【解决方案1】:

看来我找到了答案,感谢自己睡了x(

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

我将对其进行更多测试,并将此帖子编辑为 mongoengine 版本。之后我将其标记为已解决,如果没有其他人比我快:)

编辑:

那很快……:

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

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 2022-11-27
    • 2021-11-10
    • 2020-07-03
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多