Mongoose查询子文档

时间:2015-04-19 09:52:29

标签: node.js mongodb mongoose nosql

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

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

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

感谢任何帮助

1 个答案:

答案 0 :(得分: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]}

希望这有帮助!