Mongodb Querys提供了多个类似的文档

Mongodb Querys提供了多个类似的文档,mongodb,mongoose,Mongodb,Mongoose,我需要在几个文档中重复更改。但我只想给我留下一份文件。但我不能做“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

我需要在几个文档中重复更改。但我只想给我留下一份文件。但我不能做“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 ..."  }
数据不知道

  • Id'x'
  • 字符串“z”
数据如果

  • 我有一个对应于“y”的Id,在本例中对应于2
  • 我的文件最多有100份

如果他们意识到“x”中的Id在查询中没有重复,只需选择其中一个文档即可。有人知道这种查询是如何进行的吗?

我不能完全确定我是否正确理解了你的问题,但我认为你要求选择y值为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步骤,以便可以预测选择的文档


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

我不清楚,在您的示例中,为什么选择了这些特定的x:1、x:3和x:4记录?为什么结果集没有x:2?