我无法正确获得查询的答案 MongoDB - 查找方法



我的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});

最新更新