{"id":1, "priority":10}
{"id":2, "priority":9}
{"id":3, "priority":11}
Now, the input parameter is id=3, and I want to get the records which id is 3 and the record which priority is just before the record which id=3.
{"id":3, "priority":11}
{"id":1, "priority":10}
if the input parameter id=2, it shall return
{"id":2, "priority":9}
If the input parameter id=1, it shall return
{"id":1, "priority":10}
{"id":2, "priority":9}
Can it be done in one query?
delete records
db.users.deleteMany({ status : "A" })
updateMany
this is like the sql update with where clause, which update a bunch of documents satisfy the conditions.db.restaurant.updateMany( { violations: { $gt: 4 } }, { $set: { "Review" : true } } )
count and sort by count result
db.quote.aggregate([{$group: {_id:"$Symbol", quoteCount:{$sum:1}}, {$sort:{quoteCount:-1}} }])contains
db.users.findOne({"username" : {$regex : ".*son.*"}});
be careful, you cannot put in sort({"id": -1}), that will give you the error.
sort and get last N result
db.collection.find({}).sort("_id", -1).limit(N)be careful, you cannot put in sort({"id": -1}), that will give you the error.
find documents which don't contain one field
db.prediction.find({isCorrect:{$exists:false}})create unique index
db.quote.createIndex({"Symbol":1,"Date":1}, {unique:true})allowDiskUse
db.users.aggregate( [ { $group : { _id : "$key", number : { $sum : 1 } } }, ... ], { allowDiskUse:true } );
Update field name
db.prediction.update({}, {$rename:{"date":"Date"}}, false, true)distinct value
db.prediction.distinct("Prediction", {"Date":"2017-07-11"})query pipeline
db.prediction.aggregate( // Pipeline [ // Stage 1 { $match: { $and: [ { "Date": { $gte: "2017-08-01" } }, { "Date": { $lte: "2017-08-15" } } ] } }, // Stage 2 { $group: { _id:"$Symbol", count:{$sum:1} } }, // Stage 3 { $match: { count: {$lt:10} } }, // Stage 4 { $group: { _id:'all', total_count:{$sum:1} } }, ] );
$lookup to join collections
db.quote.aggregate( // Pipeline [ // Stage 1 { $match: { Date:'2017-08-14' } }, // Stage 2 { $match: { Symbol:'KO' } }, // Stage 3 { $lookup: { "from" : "prediction", "localField" : "Symbol", "foreignField" : "Symbol", "as" : "Prediction_Doc" } } ] );
$unwind to denormalize result
db.quote.aggregate( // Pipeline [ // Stage 1 { $match: { Date:'2017-08-14' } }, // Stage 2 { $match: { Symbol:'KO' } }, // Stage 3 { $lookup: { "from" : "prediction", "localField" : "Symbol", "foreignField" : "Symbol", "as" : "Prediction_Doc" } }, // Stage 4 { $unwind: "$Prediction_Doc" }, ] );https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/
Join on multiple fields
Join on one field first, then use redact eq on another field. It could take a long time if both collections are big.db.quote.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
Date:'2017-08-11'
}
},
// Stage 2
{
$lookup: {
"from" : "prediction",
"localField" : "Symbol",
"foreignField" : "Symbol",
"as" : "Prediction_Doc"
}
},
// Stage 3
{
$unwind: "$Prediction_Doc"
},
// Stage 4
{
$redact: {
"$cond": [
{ "$eq": [ "$Date", "$Prediction_Doc.Date" ] },
"$$KEEP",
"$$PRUNE"
]
}
},
]
);
https://stackoverflow.com/questions/37086387/join-two-collections-on-mutiple-field-using-lookupMatch on sub document field
continue the last example, we can add another match at the end of the pipe.$match: { 'Prediction_Doc.Mode':'mode1' } );
$redact to restrict the contents of the documents
Restricts the contents of the documents based on information stored in the documents themselves.https://docs.mongodb.com/manual/reference/operator/aggregation/redact/#pipe._S_redact
MongoDB 聚合操作
http://www.cnblogs.com/ljhdo/p/5019837.html
https://docs.mongodb.com/manual/aggregation/
SQL to Aggregation Mapping Chart
https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/
No comments:
Post a Comment