获取不同的记录值

时间:2013-12-18 10:24:20

标签: mongodb

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

{ id : 1, name : "my_name", salary : 1200 }
{ id : 2, name : "my_name", salary : 800 }
{ id : 3, name : "john", salary : 500 }

查询:使用NOT_THE_SAME(名称)

查找所有内容

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

6 个答案:

答案 0 :(得分:14)

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

> db.test.distinct("name")
[ "my_name", "john" ]

答案 1 :(得分:8)

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

db.test.distinct("name", { "salary": { $gt: 800 } })

答案 2 :(得分:5)

db.test.aggregate([{$group: {_id: "$name", salary: {$max: "$salary"}}}])

应列出所有名称​​及其工资

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

答案 3 :(得分:5)

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

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

$replaceRoot将它们用作文档,而不是使用doc将它们封装在_id字段中。

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

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

答案 4 :(得分:1)

Mongo DB版本> 3.4

db.test.distinct("name")

Mongo DB版本<3.4

db.test.aggregate([{$group: {_id: "$name", salary: {$max: "$salary"}}}])

答案 5 :(得分:0)

db.runCommand ( {
    distinct: "CollectionName", 
    key: "key", 
    query: { "createdDate": { 
        $gte:new ISODate("2017-04-04T23:59:59Z"),
        $lte:new ISODate("2017-04-25T23:59:59Z")}} } )

此查询有助于查找集合中的数据,将从满足日期间条件的所有文档中获取密钥值