我怎么能看到当字段在mongodb按字母顺序变化

How can I see when the field changes alphabetically in mongodb?

本文关键字:顺序 变化 mongodb 怎么能 字段      更新时间:2023-09-26

假设我的mongo中有一个文件,其中包含CARS集合中的这些文档。

我知道我可以用这个排序:db.cars.find().sort({car:1, price:-1})

所以我需要一个查询,把我带回每个字段的前1辆车。我想对这3个选项进行{$set:{"price_high"},{multi:true}},这样它们就有一个新的"price_high"字段,

'car':Chevy, 'price':100 //1 I need this one
'car':Chevy, 'price': 80 //2
'car':Chevy, 'price': 60 //3
'car':Lexus, 'price':99 //1 I need this one
'car':Lexus, 'price':90 //2
'car':Lexus, 'price':85 //3
'car':Maserati, 'price':99 //1 I need this one
'car':Maserati, 'price':96 //2
'car':Maserati, 'price':93 //3
MONGO终端查询不是进入文件,而是进入终端!!!!!!

作为您对MongoDB的介绍,您现在正在寻找的是.aggregate()方法。这是MongoDB在SQL中做"GROUP BY"的方式,以及许多其他从原始形式操作数据的事情。

要获取结果并"更新"数据,您现在可以这样做(最好是批量):

var bulk = db.collection.initializeOrderedBulkOp(),
    count = 0;
db.collection.aggregate([
    // Sort as required
    { "$sort": { "car": 1, "price": -1 } },
    // Group on the "first" entries per car
    { "$group": {
        "_id": "$car",
        "doc_id": { "$first": "$_id" },
        "price": { "$first": "$price" }
    }}
]).forEach(function(doc) {
    bulk.find({ "_id": doc.doc_id }).updateOne({
        "$set": { "price_high": true }
    });
    count++;
   // Empty per 1000 processed and re-init
   if ( count % 1000 == 0 ) {
       bulk.execute();
       bulk = db.collection.initializeOrderedBulkOp();
   }
});
// Clear any remaining
if ( count % 1000 != 0 )
    bulk.execute();

当然,你总是可以取出三个_id值(或多少),并在你的更新中使用$in{multi:true},而不是你相信你的真实样本足够小。

但是这里的基本情况是使用.aggregate()来获取那些"顶级文档"( $first $sort 是这里的关键),然后做任何你必须做的事情来更新你从那里得到的结果。

您可以使用组聚合函数如下:

db.cars.aggregate(
[
{$group:
  {
  "_id": "$car",
  "price":{"$max":"$price"},
  "gid":{"$first":"$_id"}
  }
 }
 ]
  ).forEach(function(doc)
   {
   db.cars.update({"_id":doc.gid,"car":doc._id,"price":doc.price},
   {"$set":{"price_high" : true}});
 }