簡體   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