获取不同的记录值

pet*_*ina 18 mongodb

有没有办法在某些字段上查询具有不同值的对象?例如,我有记录:

{ id : 1, name : "my_name", salary : 1200 }
{ id : 2, name : "my_name", salary : 800 }
{ id : 3, name : "john", salary : 500 }
Run Code Online (Sandbox Code Playgroud)

查询:使用NOT_THE_SAME(名称)查找所有内容

我只想要id为1和3的记录,因为我指定我不希望在字段name或2和3中具有相同值的记录,在这种情况下无关紧要.

Chr*_*our 15

您可以使用它db.collection.distinct来获取一系列唯一值:

> db.test.distinct("name")
[ "my_name", "john" ]
Run Code Online (Sandbox Code Playgroud)


J.C*_*ras 10

您还可以使用带过滤集合的不同句子.例如,您可以使用以下查询从800以上的工资中获取不同的名称值:

db.test.distinct("name", { "salary": { $gt: 800 } })
Run Code Online (Sandbox Code Playgroud)


Ski*_*rou 9

如果您不关心不同字段的内容但想要整个记录,这将保留(整个,感谢$$ROOT)为每个“名称”找到的第一个文档:

db.coll.aggregate([
  { "$group": { 
    "_id": "$name", 
    "doc": { "$first": "$$ROOT" }
  }},
  { "$replaceRoot": {
    "newRoot": "$doc"
  }}
])
Run Code Online (Sandbox Code Playgroud)

$replaceRoot将它们作为文档提供,而不是将它们封装在doc带有_id.

如果您担心不同字段的内容,我想您可能想先对文档进行排序:

db.coll.aggregate([
  { "$sort": { "$salary": 1 }},
  { "$group": { 
    "_id": "$name", 
    "doc": { "$first": "$$ROOT" } 
  }},
  { "$replaceRoot": {
    "newRoot": "$doc"
  }}
])
Run Code Online (Sandbox Code Playgroud)


ser*_*inc 5

db.test.aggregate([{$group: {_id: "$name", salary: {$max: "$salary"}}}])
Run Code Online (Sandbox Code Playgroud)

应该列出所有名字和他们的薪水

$max返回每个元素的最高薪水。您还可以选择其他$first,请参见https://docs.mongodb.com/manual/reference/operator/aggregation/group/#accumulator-operator