我的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:123451。我什么也找不到。谢谢你的回答。
根据位置$运算符的文档,不能在多个条件下使用$。您必须使用$elemMatch
来绕过限制。
阵列字段限制
MongoDB在处理时需要以下内容通过阵列投影:
- 投影文档中只能出现一个位置$运算符
- 只有一个数组字段,该字段受$projection限制运算符,应显示在查询文档中。其他数组字段在查询文档中可能导致未定义的行为
- 查询文档应该只包含数组字段上的一个条件正在投影。多个条件可能相互替代内部并导致未定义的行为
在这些要求下,以下查询不正确:
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});