Json 查询:mongoDb中一个字符串中匹配了多少数组元素

Json 查询:mongoDb中一个字符串中匹配了多少数组元素,json,mongodb,Json,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"]; 那么,我如何在第一次检查时获得计数;计数应为零,

假设我的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"];
那么,我如何在第一次检查时获得计数;计数应为零,第二个为3,第三个为2。(这意味着字符串中有多少个数组元素)


有可能吗?或者我应该采取什么方法?

解决这个问题的一种方法需要对您的模式进行某种形式的修改,方法是添加一个额外的字段,在数组中保存
关键字。当运行聚合管道以返回与原始字符串匹配的数组元素的所需计数时,此字段非常方便

要添加附加字段,需要执行操作来更新集合,如下所示:

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(); }
上面创建了一个额外的字段
“关键字数组”
,它是将
关键字
字符串拆分为一个数组的结果

操作完成后,您的样本采集将具有以下文档:

/* 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"
    ]
}
在下一阶段聚合框架管道中,运行以下管道操作,该操作使用运算符计算所需的计数结果:

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
}

别担心@shvetchara。如果这解决了你的问题,请考虑,但没有义务这样做。@ ShvetChakra,我认为你需要为这个问题创造一个新的问题,因为它是相当广泛的,但是,如果您能够包含所有关于如何调用JS文件以及您迄今为止尝试过的内容等的重要细节,那么您可以提高获得解决方案的机会。这很好:)在MongoDb中学习了新术语。很抱歉,我以前没有看到您的评论,我正在考虑如何在JS中执行此操作,现在也能够在javascript中运行相同的操作。再次感谢。