[英]Find query for MongoDb schema design
我有Kitchen架構,其結構如下,我想對此架構進行查找查詢以獲取具有特定ID和包來自packages數組的包。
{
"_id" : ObjectId("58aacd498caf670a837e7093"),
"name" : "Kitchen 1",
"packages" : [
{
"package" : ObjectId("58aacd038caf670a837e7091"),
"availibility" : [
{
"date" : ISODate("2015-03-25T00:00:00.000Z"),
"count" : 20
},
{
"date" : ISODate("2016-03-25T00:00:00.000Z"),
"count" : 30
}
]
},
{
"package" : ObjectId("58aacd108caf670a837e7092"),
"availibility" : [
{
"date" : ISODate("2016-03-25T00:00:00.000Z"),
"count" : 10
}
]
}
],
"__v" : 0
}
如果我使用包ID(58aacd038caf670a837e7091)和日期(2015-03-25T00:00:00.000Z)查找查詢,則響應應如下: -
{
"package" : ObjectId("58aacd038caf670a837e7091"),
"date" : ISODate("2015-03-25T00:00:00.000Z")
"count" : 20
}
在mongodb:
您將不得不使用循環來僅查看單個日期。 對於所有日期,包括匹配的一個包ID,您可以這樣做:
db.collection_name.find({'packages.package':ObjectId("package_id"),'packages.availability.date': ISODate("date")},{'packages.package':1, 'packages.availability':1}).pretty()
在mongoose中,我假設你已經導入了Kitchen模式
Kichen.find({'packages.package':"package_id",'packages.availability.date': "iso_date"}, function(err, package){
if(err)
console.log("There was an error");
if(package == null){
console.log("no package found");
} else {
//do whatever
}
});
您可以循環比較值:
db.so.find().forEach(function(po){
po.packages.forEach(function(co){
co.availibility.forEach(function(o){
if(co.package=='58aacd038caf670a837e7091'
&&
String(ISODate("2015-03-25T00:00:00.000Z"))==String(o.date)
){
o.package=co.package;
printjson(o);
}
})
})
});
{
"date" : ISODate("2015-03-25T00:00:00Z"),
"count" : 20,
"package" : ObjectId("58aacd038caf670a837e7091")
}
您可以運行使用$filter
和$arrayElemAt
運算符的聚合操作,以在幾個$project
管道步驟中返回所需的字段。
考慮以下管道:
Kitchen.aggregate([
{
"$project": {
"packages": {
"$arrayElemAt": [
{
"$filter": {
"input": "$packages",
"as": "pkg",
"cond": {
"$eq": [
"$$pkg.package",
mongoose.Types.ObjectId("58aacd038caf670a837e7091")
]
}
}
},
0
]
}
}
},
{
"$project": {
"package": "$packages.package",
"availibility": {
"$arrayElemAt": [
{
"$filter": {
"input": "$packages.availibility",
"as": "el",
"cond": {
"$eq": ["$$el.date", new Date("2015-03-25")]
}
}
},
0
]
}
}
},
{
"$project": {
"_id": 0,
"package": 1,
"date": "$availibility.date",
"count": "$availibility.count"
}
}
]).exec(function(err, docs){
if (err) throw err;
console.log(docs);
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.