[英]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.