【问题标题】:Find subdocuments in mongo在 mongodb 中查找子文档
【发布时间】:2016-08-25 05:39:33
【问题描述】:

我发现很多关于如何根据某些子文档标准查找文档的问题,但是是否可以检索子文档本身,而不是包含它们的文档?

注意 - 建议的副本不是副本。该OP询问如何返回集合中的文档,每个文档都有一个匹配子文档的子集。我的问题是,如何仅检索匹配的子文档

来自这样的集合:

{ name:"a" subs: [ { subname:"aa", value: 1 }, { subname:"ab", value: 2 } ] }
{ name:"b" subs: [ { subname:"ba", value: 2 }, { subname:"bb", value: 3 } ] }

我想做一个查询,它只产生与查询匹配的子文档,比如value === 2

我试过了:

myCollection.find().elemMatch("subs", { value:2 })

这很接近,但它只是找到(在示例数据中)两个上层文档,因为它们的子元素匹配。我知道我可以从结果中挑选出子文档,但我希望查询来完成这项工作,并产生这个......

{ subname:"ab", value: 2 }
{ subname:"ba", value: 2 }

... 即只有匹配的子文档。可能吗?提前致谢。

【问题讨论】:

标签: mongodb


【解决方案1】:

您可以在 find 的第二个参数中指定要返回的内容。用你的数据试试这个:

db.myCollection.find( { subs: { $elemMatch:  { "value" : 2 } } }, { "subs.$": 1 }  );

另外,这里有一些很好的例子:

https://docs.mongodb.org/v3.0/reference/operator/projection/positional/#proj.S

【讨论】:

    【解决方案2】:

    一个选项可以使用聚合 fwk,下面是我的示例

    db.foo.insert({ name:"a", subs : [ { subname:"aa", value: 1 }, { subname:"ab", value: 2 } ] })
    db.foo.insert({ name:"b" , subs: [ { subname:"ba", value: 2 }, { subname:"bb", value: 3 } ] })
    db.foo.insert({ name:"c", subs : [ { subname:"aa", value: 1 }, { subname:"ab", value: 2 },  { subname:"acc", value: 2 } ] })
    

    使用

    db.foo.aggregate(
     [
        { $unwind :  "$subs" },
        { $match : { "subs.value": 2 }},
        { $project :  {"subs" : 1 , "_id" : 0} }
        ]   
    )
    

    结果是

    { "subs" : { "subname" : "ab", "value" : 2 } }
    { "subs" : { "subname" : "ba", "value" : 2 } }
    { "subs" : { "subname" : "ab", "value" : 2 } }
    { "subs" : { "subname" : "acc", "value" : 2 } }
    

    如果要删除重复项,请执行最后一个 $group

    db.foo.aggregate(
     [
        { $unwind :  "$subs" },
        { $match : { "subs.value": 2 }},
        { $group : { "_id": { "subname" : "$subs.subname" , "value" : "$subs.value" }}},
        { $project :  { "subs" : "$_id" , "_id" : 0}}
        ]   
    )
    

    结果将是

    { "subs" : { "subname" : "acc", "value" : 2 } }
    { "subs" : { "subname" : "ba", "value" : 2 } }
    { "subs" : { "subname" : "ab", "value" : 2 } }
    

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多