【问题标题】:Searching nested array elements in mongodb在 mongodb 中搜索嵌套数组元素
【发布时间】:2018-05-06 22:22:02
【问题描述】:

我有一个名为“test”的集合,其中有一个类似的文档:

{
"_id" : 1
"letters" : [ 
        [ "A", "B" ], 
        [ "C", "D" ], 
        [ "A", "E", "B", "F" ]
    ]
}

如果我这样搜索:

db.getCollection('test').find({"_id" : 1}, {"letters": ["A", "B"] })

然后它将获取记录。

{
"_id" : 1
"letters" : [ 
        [ "A", "B" ], 
        [ "C", "D" ], 
        [ "A", "E", "B", "F" ]
    ]
}

如果我这样搜索:

db.getCollection('test').find({"_id" : 1}, {"letters": ["B", "A"] })

它不获取记录

我的要求是,如果我也这样给出([“B”,“A”]),它必须获取文档。因为数组中已经存在相同的字母了。

我会尝试使用 $all 运算符,但它不起作用

db.getCollection('test').find({"_id" : 1}, {"letters": {$all: ["B", "A"]} })

现在它也不会获取记录

谁能给出解决方案。

【问题讨论】:

  • 如果你使用更新,第二个参数不是你的条件
  • OP:这里有两件不同的事情:更新和查询。也许您可以将它们分开并描述您想要的输出?

标签: arrays node.js mongodb


【解决方案1】:
    db.getCollection('test').find(
        {
            "_id" : 1,
            'letters':{
                $elemMatch:{
                    $elemMatch:{
                        $in:['B','A']
                    }
                }
            }
        }
    )

此查询将查找所有包含您在最后 $in close 中指定的数组元素的文档, 例子, 如果您仅指定 $in:['C'] 或 $in:['B','A']

,它将找到相同的文档

【讨论】:

    【解决方案2】:

    你可以这样做:

     db.test.find(
           {
            "$and":[
             {"_id" : ObjectId("5a16674b4828c9f51d3b3a18")},
             {"$or":[{"letters": ["A", "B"] },{"letters": ["B", "A"] }]}
                   ]
           }
          )
    

    现在它将搜索具有["A","B"] OR ["B","A"]的文档。

    【讨论】:

    • 虽然这可行,但如果要匹配的字母数量增加,此解决方案将变得过于复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2015-06-29
    • 2018-10-06
    相关资源
    最近更新 更多