Json 查询:mongoDb中一个字符串中匹配了多少数组元素
假设我的JSON如下所示: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"]; 那么,我如何在第一次检查时获得计数;计数应为零,
{ "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中运行相同的操作。再次感谢。