子文档的猫鼬查询
Mongoose query for subdocuments
我有以下方案;它是一个对话方案,具有作为子文档结构的用户名和启用或禁用状态;
conversation = {title: "title",
users: [{"name: "a", "enabled": true}, {"name: "b", "enabled": false}]}
我想select所有启用状态设置为 true 的用户。我发现投影中的 $elemMatch 就是这样做的,但只有 returns 第一个元素...将 $elemMatch 放在查询部分中不会做任何事情...
感谢任何帮助
假设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"
}
如果您希望 return 那些将 "enabled" 字段设置为 "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}
...
在这种情况下,您可以 运行 聚合或类似的东西,从对话集合中选择用户列表到 return 所有用户的唯一列表。然后您可以在您的用户集合中查询该列表以查看哪些实际上是 enabled/disabled.
现在,假设我错了,这个启用禁用实际上表明在特定对话中哪个用户是 enabled/disabled。
那我说你的结构应该是。
conversation = {title: "title", users: [232, 3453], disabled: [232]}
希望对您有所帮助!
我有以下方案;它是一个对话方案,具有作为子文档结构的用户名和启用或禁用状态;
conversation = {title: "title",
users: [{"name: "a", "enabled": true}, {"name: "b", "enabled": false}]}
我想select所有启用状态设置为 true 的用户。我发现投影中的 $elemMatch 就是这样做的,但只有 returns 第一个元素...将 $elemMatch 放在查询部分中不会做任何事情...
感谢任何帮助
假设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"
}
如果您希望 return 那些将 "enabled" 字段设置为 "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}
...
在这种情况下,您可以 运行 聚合或类似的东西,从对话集合中选择用户列表到 return 所有用户的唯一列表。然后您可以在您的用户集合中查询该列表以查看哪些实际上是 enabled/disabled.
现在,假设我错了,这个启用禁用实际上表明在特定对话中哪个用户是 enabled/disabled。 那我说你的结构应该是。
conversation = {title: "title", users: [232, 3453], disabled: [232]}
希望对您有所帮助!