在mongodb

时间:2017-11-16 18:19:18

标签: mongodb

我有一个像这样的集合

/* 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。

1 个答案:

答案 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' }, 
           ] 
   }

它只是说,找到数组rowdatasfield_name: 'Department'field_value: 'Arnab'的任何文档。这对于文档10来说是正确的,因为它查看完整的数组rowdata

如果您现在添加$elemMatch查询运算符,请执行以下操作:

{ rowdatas: {$elemMatch: {'field_name': 'Department', 'field_value': 'Arnab' }}}

然后,您只是说您希望这些字段(field_namefield_value)在单个数组条目中匹配。

希望您了解通过点(rowdatas.field_name)和$elemMatchrowdatas: {$elemMatch: {'field_name': ...)查询数组字段之间的区别现在好一点。