【问题标题】:Match documents with fields not containing values in array匹配具有不包含数组值的字段的文档
【发布时间】:2017-07-01 21:56:58
【问题描述】:

经过 db.collection.aggregate 中的一些“匹配”步骤后,我得到了

{_id: 1, field1: "a", field2: ["1.1.1", "1.1.2", "1.1.3", "1.1.4"]}
{_id: 2, field1: "b", field2: [         "1.1.2",          "1.1.4"]}
{_id: 3, field1: "c", field2: ["1.1.1", "1.1.2"                  ]}
{_id: 4, field1: "d", field2: [                           "1.1.4"]}
{_id: 5, field1: "e", field2: [                  "1.1.3"         ]}

// 我做了预格式化

我想应用另一个规则(我想它会是“组”规则)以获取“field2”不包含“1.1.1”或“1.1.4”的所有文档。所以我需要没有“1.1.1”或“1.1.4”或(“1.1.1”和“1.1.4”)的文件。

我想得到这样的东西:

{_id: 5, field1: "e", field2: [                  "1.1.3"         ]}

所以,我有 field2,它是每个文档中的数组,我想获取给定数组中没有单个元素的所有文档(例如 [“1.1.1”,“1.1.4”])。

附:我需要这个用于“单语句聚合命令”。不接受额外的 JS。

更新

@blakes-7, tnx

我的错误是我用过

{ "$match": { "field2": { "$elemMatch": { "$nin": ["1.1.1","1.1.4"] } } } }

但正确的做法就是使用

{ "$match": { "field2": {                 "$nin": ["1.1.1","1.1.4"] } } }

不要高估 $elemMatch :)

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    实际上,您只需要在$match 中添加$nin

    { "$match": { "field2": { "$nin": ["1.1.1","1.1.4"] } } }
    

    也可能有更好的方法可以在您在管道中达到之前获得该结果,但由于您的问题没有解释,所以没有办法说出来。

    【讨论】:

    • 其实我试过了。但是它给出了像“_id:”2和5这样的错误结果。似乎这个“匹配”是这样做的:检查field2是否包含“1.1.1”,而2和5不包含,甚至没有检查“1.1” .4",继续。
    • @BurlakaSergey 你没有做我做过的事情,因为我唯一的结果是5。我相信你犯了一个错误。
    猜你喜欢
    • 2016-07-17
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多