繁体   English   中英

查找包含MongoDB中特定文档的数组的文档

[英]Find document with array that consists exclusively particular documents in MongoDB

我有收集path_testpath_test有2个文件

文件1

{
  "_id" : 1,
  "tpc" : 5,
  "path" : [ 
    {
      "nids" : [ 0, 10, 11 ],
      "ctc" : 2
    }, 
    {
      "nids" : [ 0, 10 ],
      "ctc" : 2
    }, 
    {
      "nids" : [ 0, 10, 21 ],
      "ctc" : 1
    }
  ]
}

文件2

{
  "_id" : 2,
  "tpc" : 5,
  "path" : [ 
    {
      "nids" : [ 0, 10, 110 ],
      "ctc" : 1
    }, 
    {
      "nids" : [ 0, 10, 11 ],
       "ctc" : 2
    }, 
    {
      "nids" : [ 0, 5 ],
      "ctc" : 2
    }
  ]
}

我想要得到的结果是带有path数组的文档,其中所有元素都有像[0, 10, *] nids [0, 10, *]这样的nids 订单很重要,所以[10, 0, *]将是错误的。 它应该找到文档1,但不是文档2.在开始使用map-reduce或聚合之前,希望我能用查询解决这个问题。

这是我到目前为止所尝试的

查询1

db.getCollection('path_test').find( {
  "path": { $not: { $elemMatch: { "nids.0": { $nin: [0] }, "nids.1": { $nin: [10] } } } }
});

查询2

db.getCollection('path_test').find( {
  "path.nids": { $not: { $elemMatch: { $nin: [0, 10] } } }
});

但是两个查询都给我结果,其中只有0在或只有10在,但我需要两个,并按照确切的顺序。

那可能吗?

至少没有一个意味着没有人

查询1

为简化起见,让我们分配

A = "nids.0": { $ne: 0 }
B = "nids.1": { $ne: 10 }
C = { A, B }

然后

{ "path" : { $elemMatch: C } }

将找到path数组中至少有一个元素满足条件C文档

{ "path" : { $not: { $elemMatch: C } } }

将找到path数组中没有满足条件C元素的文档。

文档1和文档2的path数组中没有满足条件C元素,因此Query1输出包含它们。 如果,fe,则添加到Document 1的path数组中

{ "nids": [ 1, 11, 110], "ctc" : 1 }

然后,文档1将不在查询1的输出中,因为这个添加的元素满足C

查询2

为简化起见,让我们分配

C = { $nin: [0, 10] }

然后

{ "path.nids" : { $not: { $elemMatch: C } } }

将找到满足条件C path.nids数组中没有元素的文档。

path.nids数组中的文档1和文档2具有满足条件C元素,因此查询2输出不包含它们。 如果,fe,你添加到收藏文件

{ "_id" : 6, "tpc" : 5, "path" : [ { "nids" : [ 0, 10 ], "ctc" : 1 } ] }

然后它将在查询2的输出中,因为在path.nids数组中没有满足C元素。

在查询1中替换

{ $elemMatch: { "nids.0": { $nin: [0] }, "nids.1": { $nin: [10] } } }

{ $elemMatch: { $or: [ { "nids.0": { $ne: 0 } }, { "nids.1": { $ne: 10 } } ] } }

这个新的Query将找到文件,其中path数组中没有元素满足条件AB至少一个。 因此,它将找到文档1,但不是文档2(其中"nids" : [ 0, 5 ]不满足条件B

请注意, { $ne: 10 }相当于{ $nin: [10] }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM