假设我的 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
是这里的关键),然后执行任何您必须做的事情来更新从那里获得的结果。
关于javascript - 如何查看字段在 mongodb 中按字母顺序变化的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30705647/