Mongoose查询子文档

我有以下计划; 它的一个会话scheme,作为子文档结构的用户名和启用或禁用状态;

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

我想要select启用状态设置为true的所有用户。 我发现在投影$ elemMatch只是这样做,但只返回第一个元素…把$ 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" } 

如果您希望返回具有“已启用”字段的用户条目设置为“真”的条目,则可以执行以下操作

 > 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"]} 

假设在你的情况下,“一个”,“B”是唯一的标识,否则我build议你保持在这里的ID。

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

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

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

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

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

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

希望这可以帮助!