0

我需要查询在多个文档中重复更改。但我只想给我留下一份文件。但是我不能做'FindOne',为什么要带更多具有相同特征的文件。作为这样的查询前?

这意味着,我在收藏中有这个

{ x : ObjectId(1), y : [ ObjectId(2) ], z : "My string ..." }
{ x : ObjectId(2), y : [ ObjectId(3), ObjectId(1) ], z : "My string ..." }
{ x : ObjectId(3), y : [ ObjectId(4), ObjectId(2) ], z : "My string ..." }
{ x : ObjectId(4), y : [ ObjectId(3) ], z : "My string ..." }
{ x : ObjectId(1), y : [ ObjectId(2), ObjectId(4) ], z : "My string ..." }
{ x : ObjectId(1), y : [ ObjectId(2) ], z : "My string ..." }
{ x : ObjectId(4), y : [ ObjectId(3) ], z : "My string ..." }
{ x : ObjectId(4), y : [ ObjectId(1), ObjectId(2) ], z : "My string ..." }
{ x : ObjectId(4), y : [ ObjectId(1), ObjectId(2) ], z : "My string ..." }
{ x : ObjectId(1), y : [ ObjectId(2), ObjectId(1) ], z : "My string ..." }
{ x : ObjectId(1), y : [ ObjectId(2), ObjectId(3) ], z : "My string ..." }

现在我想去

{ x : ObjectId(1), y : [ ObjectId(2) ], z : "My string ..."  }
{ x : ObjectId(3), y : [ ObjectId(4), ObjectId(2) ], z : "My string ..."  }
{ x : ObjectId(4), y : [ ObjectId(1), ObjectId(2) ], z : "My string ..."  }

数据不知道

  • 标识“x”
  • 字符串'z'

数据如果

  • 在这种情况下,我有一个对应于 'y' 的 ID 对应于 2
  • 我有一个最大文件数或限制为 100

如果他们意识到'x'中的Id,在查询中没有重复,只需选择其中一个文档。有谁知道这种查询是怎么回事??????

4

1 回答 1

0

我不完全确定我是否正确理解了您的问题,但我认为您要求选择 ay 值为 2 的所有文档,其中,为每个特定 x 值仅选择一个文档,您不在乎哪个在它选择的具有给定 x 值的文件中记录?此外,您希望最多选择 100 个此类文档。我说的对吗?

该查询可以通过使用以下聚合管道来完成:

collection.aggregate([
    {$match: {y: 2}},
    {$group: {_id: '$x', x: {$first:'$x'}, y: {$first:'$y'}, z: {$first:'$z'}}},
    {$limit: 100}
])

MongoDB 聚合管道由一系列步骤组成,其工作方式与 Unix 管道非常相似,将文档流从一个阶段传递到下一个阶段。此管道有 3 个步骤:

  • 第一步,$match,接收集合中的所有文档作为输入,并且仅将那些y值为2的文档输出到下一个阶段。(请注意,我使用2而不是ObjectId(2),正如您在示例中编写的那样它正确地形成了我可以测试的代码。)

  • 第二步 $group 执行聚合。这意味着它只输出具有给定 _id 字段的单个文档,在本例中指定为输入文档中的 x 字段。这将满足您仅选择具有给定值 x 的单个文档的要求。此外,输出文档中的 x、y 和 z 字段被任意设置为组中第一个文档中的 x、y 和 z 字段的值,这与您不关心哪个它选择具有给定 x 的文档。

  • 最后一步 $limit 将返回的文档数限制为 100。

请注意,选择给定值为 x 的文档中的哪一个将是完全不可预测的,因为处理文档的顺序是未定义的,类似于 findOne 匹配多个文档时未定义返回哪个文档的方式。如果您希望可以预测选择了哪个文档,通常建议在使用 $first 或 $last 之前在管道中使用 $sort 步骤。

我希望这会有所帮助,如果我误解了您的问题或者您还有其他问题,请告诉我。

于 2013-09-20T15:15:55.477 回答