我的json:
{
"user_id" : "1000" ,
"boxes" : [
{
"box_id" : "12345",
"box_name" : "Box 3",
"items" : [],
"visible" : false
},
{
"box_id" : "2000",
"box_name" : "Box 1",
"items" : [],
"visible" : true
},
{
"box_id" : "3000",
"box_name" : "Box 2",
"items" : [],
"visible" : true
}
],
"user_name" : "Jimmy",
}
我只是想获取属于user_id:"1000"
,属于visible: true
和属于box_id: "3000"
的盒子。
我的查询是:
db.getCollection("users")
.find({user_id:"1000",
$and: [{"boxes.box_id": "3000"},{"boxes.visible": true}]},
{"boxes.$":1})
但是我总是得到box_id:12345一个。我什么都找不到。 谢谢您的回答。
答案 0 :(得分:0)
根据the documentation for the positional $ operator,不能在多个条件下使用$。您必须使用$elemMatch
来解决该限制。
数组字段限制
MongoDB在处理时需要满足以下条件 在数组上投影:
- 投影文档中只能出现一个位置$运算符。
- 仅一个数组字段,该字段受$投影限制 运算符,应出现在查询文档中。附加数组字段 查询文档中的内容可能会导致未定义的行为。
- 查询 文档只能在数组字段上包含一个条件 被投影。多个条件可能会相互覆盖 内部,并导致不确定的行为。
在这些要求下,以下查询不正确:
db.collection.find( { <array>: <value>, <someOtherArray>: <value2> }, { "<array>.$": 1 } )
要在该数组内的文档的多个字段上指定条件, 使用$ elemMatch查询运算子。以下查询返回 成绩数组中的第一个文档的平均值大于 70分,且成绩大于90分。
db.students.find( { grades: { $elemMatch: { mean: { $gt: 70 }, grade: { $gt:90 } } } }, { "grades.$": 1 } )
如果需要单独的条件,则必须使用$ elemMatch运算符 用于选择文档并在其中选择字段 文档。
所以我会尝试这样的查询:
db.users.find({ user_id:"1000", boxes: { $elemMatch: { "box_id": "3000", "visible": true } } }, {"boxes.$":1});