[英]query in mongoDb using JavaScript
這是我在DB中的示例文檔。
{
"_id":1,
"object":{
"featureOne":true,
"featureTwo":false,
"featureThree":false,
"featureFour":false
}
}, {
"_id":2,
"object":{
"featureOne":false,
"featureTwo":false,
"featureThree":false,
"featureFour":false
}
}, {
"_id":3,
"object":{
"featureOne":true,
"featureTwo":false,
"featureThree":false,
"featureFour":false
}
}
我想在一個查詢中獲得一個帶有“ featureOne”的對象:true,另一個帶有“ featureOne”的對象:false。 我具有使用特定鍵和值查找數據的知識。 但是,如何在單個查詢中使用相同的true和false值鍵獲取數據。 目前我正在使用此代碼
db.collection(collectionName).find({"featureOne":true, {limit:1}).toArray(function(err, results) {
db.collection(collectionName).find("featureOne":,false{limit:2}).toArray(function(err,res {
console.log(results,res);
});
});
有沒有更好的方法來實現這一目標?
使用$ aggregate ,我們可以做到這一點
查詢取得結果
db.collection.aggregate([
{$group:{"_id": {"featureOne":"$object.featureOne"},
object:{$first:"$object"},
origId:{$first:"$_id"}}
},
{$project:{_id:"$origId", object:"$object"}}
])
樣本數據
{ "_id" : 1, "object" : { "featureOne" : true, "featureTwo" : false, "featureThree" : false, "featureFour" : false } }
{ "_id" : 2, "object" : { "featureOne" : false, "featureTwo" : false, "featureThree" : false, "featureFour" : false } }
{ "_id" : 3, "object" : { "featureOne" : true, "featureTwo" : false, "featureThree" : false, "featureFour" : false } }
{ "_id" : 4, "object" : { "featureOne" : true, "featureTwo" : true, "featureThree" : false, "featureFour" : true } }
{ "_id" : 5, "object" : { "featureOne" : false, "featureTwo" : false, "featureThree" : false, "featureFour" : true } }
{ "_id" : 6, "object" : { "featureOne" : true, "featureTwo" : true, "featureThree" : false, "featureFour" : false } }
在對這些數據執行$ group之后 ,我們將得到\\
{ "_id" : { "featureOne" : false }, "object" : { "featureOne" : false, "featureTwo" : false, "featureThree" : false, "featureFour" : false }, "origId" : 2 }
{ "_id" : { "featureOne" : true }, "object" : { "featureOne" : true, "featureTwo" : false, "featureThree" : false, "featureFour" : false }, "origId" : 1 }
為了使它看起來像原始集合一樣具有表現力,我們必須使用$ project,在對結果執行$ project管道后,我們將得到
{ "_id" : 2, "object" : { "featureOne" : false, "featureTwo" : false, "featureThree" : false, "featureFour" : false } }
{ "_id" : 1, "object" : { "featureOne" : true, "featureTwo" : false, "featureThree" : false, "featureFour" : false } }
您可以使用聚合框架來實現。
您可以使用$ group和$ project階段(如Clement Amarnath答案中所述),但是如果您需要對數據收集階段進行更多控制,則可以使用:
示例代碼:
db.collection.aggregate([
{
$facet: {
"result1": [
{$match: {"object.featureOne": true}},
{$limit: 1}
],
"result2": [
{$match: {"object.featureOne": false}},
{$limit: 1}
]
}
},
{$addFields: {"results": [{$arrayElemAt: ["$result1", 0]}, {$arrayElemAt: ["$result2", 0]}]}},
{$unwind: "$results"},
{$replaceRoot: {newRoot: "$results"}}
])
我認為您的方法很好。 但是,在兩種情況下,您的限制都可以為1,例如,在Mongoose中,您可以致電findOne,但我認為使用官方驅動程序是正確的。
如果要避免兩次調用,則可以提取集合的所有元素,並在代碼中循環遍歷它們,直到獲得每個值之一。 如果您的收藏夾中沒有太多文檔,則可能比其他方法更有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.