查询提升了多个类似的文档

时间:2013-09-20 04:58:50

标签: 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(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,则不在查询中重复,只需选择其中一个文档即可。任何人都知道如何查询?????

1 个答案:

答案 0 :(得分:0)

我不完全确定我理解你的问题,但我认为你要求选择所有值为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,收集集合中的所有文档作为输入,并且只向那些值为2的那些文件输出到下一个阶段。(注意我使用了2而不是ObjectId(2)作为你在您的示例中写道,只需使其正确形成我可以测试的代码。)

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

  • 最后一步,$ limit,将返回的文件数量限制为100个。

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

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