所以说我的mongo中有一个文件,在CARS集合中有这些文件。
我知道我可以对此进行排序:db.cars.find().sort({car:1, price:-1})
所以我需要一个查询,让我回到每个汽车领域的前1辆车。我希望{$set:{"price_high"},{multi:true}}
对这3个选项进行'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
,以便他们只将“price_high”的新字段添加到这些选项中。
$("input[value='verified']").prop("checked", true);
MONGO TERMINAL QUERY只是不进入一个文件但是进入终端!!!!!!
答案 0 :(得分:3)
正如您对MongoDB的介绍,您现在正在寻找的是.aggregate()
方法。这是MongoDB的做法" GROUP BY"在SQL中,以及许多其他操纵数据的原始形式。
同时获得结果并且"更新"你现在做的事情是这样的(理想情况下是批量):
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
是此处的关键字),然后执行您需要做的任何事情来更新从那里获得的结果。
答案 1 :(得分:0)
您可以使用组聚合功能,如下所示:
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}});
}