【问题标题】:Mongoose query for subdocuments子文档的猫鼬查询
【发布时间】:2015-06-26 00:31:06
【问题描述】:

我有以下方案;它是一个会话方案,具有子文档结构、用户名和启用或禁用状态;

conversation = {title: "title", 
users: [{"name: "a", "enabled": true}, {"name: "b", "enabled": false}]}

我想选择所有启用状态设置为 true 的用户。我发现投影中的 $elemMatch 就是这样做的,但只返回第一个元素......将 $elemMatch 放在查询部分不会做任何事情......

感谢任何帮助

【问题讨论】:

    标签: node.js mongodb mongoose nosql


    【解决方案1】:

    假设mongo结构如下

    > db.conversation.find().pretty()
    {
        "_id" : ObjectId("55337db16f20d74ec08c33b1"),
        "title" : "title",
        "users" : [
            {
                "name" : "a",
                "enabled" : true
            },
            {
                "name" : "b",
                "enabled" : false
            }
        ]
    }
    {
        "_id" : ObjectId("553380ac6f20d74ec08c33b2"),
        "users" : [
            {
                "name" : "a",
                "enabled" : false
            },
            {
                "name" : "b",
                "enabled" : false
            }
        ],
        "title" : "Abc"
    }
    

    如果您希望返回那些将“已启用”字段设置为“true”的用户的条目,那么以下操作即可

    > db.conversation.find({users: {$elemMatch: { "name":{$exists: true} ,"enabled":true}  }}).pretty()
    {
        "_id" : ObjectId("55337db16f20d74ec08c33b1"),
        "title" : "title",
        "users" : [
            {
                "name" : "a",
                "enabled" : true
            },
            {
                "name" : "b",
                "enabled" : false
            }
        ]
    }
    

    但我不喜欢你使用的数据结构。

    假设(假设是这种情况)您必须跟踪对话。以下内容对您有用吗?

    conversation = {title: "title", users: ["a", "b"]}
    

    假设在您的情况下“a”、“b”是唯一标识,否则我建议您将 ID 保留在此处。

    conversation = {title: "title", users: [3434, 984]}
    

    拥有另一个存储您的用户数据的集合(以下是典型条目)。

    {"user_id": 3434, "enabled": true}
    ...
    

    在这种情况下,您可以运行聚合或其他操作,从会话集合中选择用户列表,以返回所有用户的唯一列表。然后,您可以在您的用户集合中查询该列表以查看实际启用/禁用的列表。

    现在,假设我错了,这个启用的禁用实际上表示在特定对话中启用/禁用了哪个用户。 那么我会说你的结构应该是。

    conversation = {title: "title", users: [232, 3453], disabled: [232]}
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您这么长的回答。如果我确实使用了您的最后一个建议,例如保留一组禁用用户(没有双关语),我将如何在此特定对话中仅选择和显示启用的用户?
    • 在这种情况下,我会说在将用户标记为从对话中禁用时,您将其从用户列表中删除并将其移动到禁用列表中。这样您就可以确定“用户”字段中只存在启用的用户,而“禁用”字段中存在禁用的用户。否则,如果您想将所有用户保留在“用户”字段中并保留一个单独的列表来维护禁用列表,那么代码会这样做。或者您可以使用 mongo 管道为集合中的每个条目返回一个自定义条目(执行与代码完全相同的操作,用户减去禁用 = 启用的用户)
    • 如果你使用的是mongodb版本stackoverflow.com/questions/17268770/…这个问题参考第二个
    猜你喜欢
    • 2017-06-01
    • 1970-01-01
    • 2019-10-19
    • 2014-03-21
    • 2013-10-21
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多