我有一个像这样的集合
/* 9 */
{
"_id" : ObjectId("5a0da2f9a0d00b28dcc69b29"),
"list_id" : ObjectId("59ec6c97a0d00bc96b5680d4"),
"rowdatas" : [
{
"_id" : ObjectId("5a0da2f9a0d00b28dcc69b2a"),
"field_id" : "59ec6d33a0d00bc96b5680d8",
"field_name" : "Title2",
"field_value" : "Arvind",
"field_type" : "sltext"
},
{
"_id" : ObjectId("5a0da2faa0d00b28dcc69b2b"),
"field_id" : "59ec8a2ea0d00bc96b568111",
"field_name" : "Department",
"field_value" : "AS",
"field_type" : "dropdown"
}
]
}
/* 10 */
{
"_id" : ObjectId("5a0da306a0d00b28dcc69b2c"),
"list_id" : ObjectId("59ec6c97a0d00bc96b5680d4"),
"rowdatas" : [
{
"_id" : ObjectId("5a0da306a0d00b28dcc69b2d"),
"field_id" : "59ec6d33a0d00bc96b5680d8",
"field_name" : "Title2",
"field_value" : "Arnab",
"field_type" : "sltext"
},
{
"_id" : ObjectId("5a0da306a0d00b28dcc69b2e"),
"field_id" : "59ec8a2ea0d00bc96b568111",
"field_name" : "Department",
"field_value" : "SD",
"field_type" : "dropdown"
}
]
}
/* 11 */
{
"_id" : ObjectId("5a0da30fa0d00b28dcc69b2f"),
"list_id" : ObjectId("59ec6c97a0d00bc96b5680d4"),
"rowdatas" : [
{
"_id" : ObjectId("5a0da30fa0d00b28dcc69b30"),
"field_id" : "59ec6d33a0d00bc96b5680d8",
"field_name" : "Title2",
"field_value" : "Ankush",
"field_type" : "sltext"
},
{
"_id" : ObjectId("5a0da30fa0d00b28dcc69b31"),
"field_id" : "59ec8a2ea0d00bc96b568111",
"field_name" : "Department",
"field_value" : "SD",
"field_type" : "dropdown"
}
]
}
我试图以这样一种方式查询这个集合,它只返回记录号9和10 " FIELD_NAME" :"部门"和 " FIELD_VALUE" :" SD"
我试过的查询是
db.getCollection('ldata').find(
{ $and: [
{"list_id": ObjectId("59ec6c97a0d00bc96b5680d4")} ,
{ 'rowdatas.field_name': 'Department', 'rowdatas.field_value': 'AS' },
]
}
)
这将正确返回2条记录,即9和10.但是,如果我通过' rowdatas.field_value':' Arnab'它仍然返回我的记录号10.这应该归还给我零结果,因为我试图找到部门名称为" SD" 。在这种情况下,它匹配field_value而不组合AND查询的field_name。
答案 0 :(得分:1)
您需要在查询中添加$elemMatch
。所以你的查询看起来像这样:
db.getCollection('ldata').find(
{ $and: [
{"list_id": ObjectId("59ec6c97a0d00bc96b5680d4")} ,
{ rowdatas: {$elemMatch: {'field_name': 'Department', 'field_value': 'Arnab' }}},
]
}
)
这将不会返回任何结果。
更好地解释一下。您的查询的作用:
$and: [
{"list_id": ObjectId("59ec6c97a0d00bc96b5680d4")} ,
{ 'rowdatas.field_name': 'Department', 'rowdatas.field_value': 'Arnab' },
]
}
它只是说,找到数组rowdatas
有field_name: 'Department'
和field_value: 'Arnab'
的任何文档。这对于文档10来说是正确的,因为它查看完整的数组rowdata
。
如果您现在添加$elemMatch
查询运算符,请执行以下操作:
{ rowdatas: {$elemMatch: {'field_name': 'Department', 'field_value': 'Arnab' }}}
然后,您只是说您希望这些字段(field_name
和field_value
)在单个数组条目中匹配。
希望您了解通过点(rowdatas.field_name
)和$elemMatch
(rowdatas: {$elemMatch: {'field_name': ...
)查询数组字段之间的区别现在好一点。