繁体   English   中英

使用JavaScript在mongoDb中查询

[英]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"}}
])

$ group$ project用于获得此结果

样本数据

{ "_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答案中所述),但是如果您需要对数据收集阶段进行更多控制,则可以使用:

  • $ facet-通过子聚合管道收集数据。
  • $ match-设置文档过滤条件。
  • $ limit-定义可以获取的最大文档数量(如果要随机分配结果,请使用$ sample )。
  • $ addFields-将结果合并为一个元素(数组)。
  • $ unwind-将结果数组拆分为单独的文档。
  • $ replaceRoot-更改文档根元素。

示例代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM