簡體   English   中英

查詢:mongoDb中的字符串中匹配多少個數組元素

[英]Query for : How many elements of an array are matching within a string in mongoDb

假設我的JSON如下所示:

{ "id":0,"keywords":"amount,debited,account,ticket,not,generated,now" }
{ "id":1,"keywords":"how,safe,gocash" }
{ "id":2,"keywords":"how,referral,program,gocash,works" }

如果我的數組像

array =["how","safe","gocash"];

那么我如何在與首先檢查時得到計數? 計數應為零,第二個為第三,第二個為三個。 (這意味着字符串中存在多少個數組元素)

有可能還是應該采用什么方法?

解決此問題的一種方法是,通過添加一個將keywords保存在數組中的額外字段,需要對架構進行某種形式的修改。 在運行聚合管道以返回與原始字符串匹配的數組元素的所需計數時,此字段變得非常方便。

要添加其他字段,您將需要Bulk API操作來更新集合,如下所示:

var bulk = db.collection.initializeOrderedBulkOp(),   
    count = 0;

db.collection.find({"keywords": { "$exists": true, "$type": 2 }}).forEach(function(doc) { 
    var keywordsArray = doc.keywords.split(',');
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "keywordsArray": keywordsArray }
    });
    count++;
    if (count % 100 == 0) {
        bulk.execute();
        bulk = db.collection.initializeUnorderedBulkOp();
    }
});

if (count % 100 != 0) { bulk.execute(); }

上面創建了一個附加字段"keywordsArray" ,這是將keywords字符串拆分為數組的結果。

手術后,您的樣品采集將具有以下文件:

/* 0 */
{
    "_id" : ObjectId("561e24e9ba53a16c763eaab4"),
    "id" : 0,
    "keywords" : "amount,debited,account,ticket,not,generated,now",
    "keywordsArray" : [ 
        "amount", 
        "debited", 
        "account", 
        "ticket", 
        "not", 
        "generated", 
        "now"
    ]
}

/* 1 */
{
    "_id" : ObjectId("561e24e9ba53a16c763eaab5"),
    "id" : 1,
    "keywords" : "how,safe,gocash",
    "keywordsArray" : [ 
        "how", 
        "safe", 
        "gocash"
    ]
}

/* 2 */
{
    "_id" : ObjectId("561e24e9ba53a16c763eaab6"),
    "id" : 2,
    "keywords" : "how,referral,program,gocash,works",
    "keywordsArray" : [ 
        "how", 
        "referral", 
        "program", 
        "gocash", 
        "works"
    ]
}

進入下一個階段,聚合框架管道,運行以下管道操作,該操作使用$let$size$setIntersection運算符得出所需的計數結果:

var array = ["how","safe","gocash"];
db.collection.aggregate([
    {
        "$project": {
            "id": 1, "keywords": 1,
            "count": {
                "$let": {
                   "vars": {
                      "commonToBoth": { "$setIntersection": [ "$keywordsArray", array ] }
                   },
                   "in": { "$size": "$$commonToBoth" }
                }
            }
        }
    }
])

樣本輸出:

/* 0 */
{
    "result" : [ 
        {
            "_id" : ObjectId("561e24e9ba53a16c763eaab4"),
            "id" : 0,
            "keywords" : "amount,debited,account,ticket,not,generated,now",
            "count" : 0
        }, 
        {
            "_id" : ObjectId("561e24e9ba53a16c763eaab5"),
            "id" : 1,
            "keywords" : "how,safe,gocash",
            "count" : 3
        }, 
        {
            "_id" : ObjectId("561e24e9ba53a16c763eaab6"),
            "id" : 2,
            "keywords" : "how,referral,program,gocash,works",
            "count" : 2
        }
    ],
    "ok" : 1
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM