数组中的完全匹配(MongoDB)

时间:2015-04-30 05:52:14

标签: arrays mongodb

我在MongoDB中有一个如下所示的集合:

{
 "_id" : 1,
 "parent" : 1,
 "input" : [
     {
       "name" : "IAA1",
       "value" : "IAA1 Value3",
       "displayOrder" : 1
     },
     {
       "name" : "IAA2",
       "type" : "IAA2 Value4",
       "displayOrder" : 2
     }]
}

{
 "_id" : 2,
 "parent" : 1,
 "input" : [
    {
      "name" : "IAA1",
      "value" : "IAA1 Value3",
      "displayOrder" : 1
    },
    {
      "name" : "IAA2",
      "type" : "IAA2 Value4",
      "displayOrder" : 2
    },
    {
       "name" : "IAA3",
       "type" : "IAA2 Value4",
       "displayOrder" : 2
    } ]
}

我需要做的是,只查找那些包含与name的值匹配的所有数组元素的文档。例如:

  1. {"input.name":{$all:["IAA1","IAA2","IAA3"]}}
  2. 这样可以正常工作并返回两个文档,但是这个:

    1. {"input.name":{$all:["IAA1","IAA2"]}}
    2. 也返回两个文档。我的要求是第二个查询应该只返回第一个文档而不是第二个文档,因为它有一个带有name:"IAA3"的额外元素。

        

      数组中元素的顺序不固定   我需要根据父ID以及应该存在哪些列来动态生成查询。

2 个答案:

答案 0 :(得分:1)

您需要使用$size$all运算符的组合来获得所需的结果。 大小必须是您在$ all 中使用的参数数量。在这里,您必须检查输入数组的大小为$ all中的参数数量,以便它仅在那些大小与参数数量匹配的input数组中搜索给定参数($ all)。

e.g。在示例Json中,您在$ all中使用2个参数,因此您必须将input的$ size设置为2.在这种情况下,查询将仅搜索大小为2的input

查询将类似于 -

db.collection.find({
"input.name": {
    $all: ["IAA1", "IAA2"]
},
"input": {
    $size: 2 // This is the number of param you pass in $all
}
}).pretty()

答案 1 :(得分:0)

为了完全匹配,您应该只查询数组中的元素。例如:

{"input.name":["IAA1", "IAA2"]}

参考here