【问题标题】:How to know which array element is present in my database array?如何知道我的数据库数组中存在哪个数组元素?
【发布时间】:2016-02-14 12:52:03
【问题描述】:

我想在 mongoDB 中编写一个查询,我想在其中查找我的数组的哪些元素存在于数据库数组“upvotes”中,我的查询如下所示

userupvotesmodel.findOne({mobile_no: "1234567890", upvotes : { $in : ["aa", "bdnvh", "563fa4408d88ea6c13c7abba", "djfufhgj", "5625bd9dbe545d2412d4ae62", "fjjshddhjfn", "djfhudh", "jfhshnffj", "sjdhfkskajdk"] } }, function(err, docs) {
                                if (err) {
                                    console.log('Error Finding query results');
                                    console.log(err);
                                    res.json({success: 0, message : err});
                                    return next(err);
                                } else {
                                    if (docs) {
                                        console.log('2 mins', currentdate.getMinutes());
                                        console.log('2 secs', currentdate.getSeconds());
                                        console.log('docs', docs);
                                    }
                                }
});

现在对于上面的查询,如果我的数组的任何单个值存在于数据库中,那么它会发送整个 upvotes 数组,但我无法找出数据库中存在哪些元素,例如“aa”、“bdnvh”等我编写了一个查询来了解数据库中存在哪些元素。

我想通过查询每个元素在一个查询中找到它;我知道我可以做到这一点,但我想在任何可能的单个 mongoDB 查询中做到这一点。

【问题讨论】:

  • map-reduce 怎么样?
  • @stdob--你能在这里给我任何使用 map-reduce 的链接吗??

标签: arrays node.js mongodb mongoose


【解决方案1】:

您可以使用聚合框架。首先 $unwind 你的 upvotes 数组。然后对您提供的数组中的元素进行 $match 。比 $group 回到 _id(或任何你想要的)上,用 $addToSet 或 $push 创建“matched_elements”数组。返回的文档将仅包含也在您的数组中的 upvotes 元素(在“matched_elements 数组”中)。

var my_array = ["aa", "bdnvh", "563fa4408d88ea6c13c7abba", "djfufhgj", "5625bd9dbe545d2412d4ae62", "fjjshddhjfn", "djfhudh", "jfhshnffj", "sjdhfkskajdk"];

db.collection.aggregate( [ 
  { "$unwind" : "$upvotes" }, 
  { "$match": { "upvotes": {"$in": my_array} } },
  { "$group" : { "_id":"$_id","matched_elements":{ "$addToSet": "$upvotes" }}}
] );

【讨论】:

  • 我在 mongoose 中使用此查询,但即使我在 my_array 中有一个元素出现在 upvotes aray 中,它也没有返回任何结果,你能帮我弄清楚为什么它没有运行吗??跨度>
  • userfavouritemodel.aggregate([ { "$match": { "upvotes": {"$in": my_array}, "mobile_no":"1234567890" } }, { $unwind: "$upvotes " }, { "$group" : { "_id":"$_id","matched_elements":{ "$addToSet": "$upvotes" }}} ], function (err, result) { if (err) { console.log(err); return; } console.log('user favourites'); console.log(result); });
  • @alan 你在吗?请帮帮我??
  • 不,它不工作艾伦你能帮我吗??
【解决方案2】:

我认为您不必担心查询,您可以使用 java 脚本代替。只需遍历 docs.upvotes 数组并将其值与您提供的数组进行比较。

var my_array = ["aa", "bdnvh", "563fa4408d88ea6c13c7abba", "djfufhgj", "5625bd9dbe545d2412d4ae62", "fjjshddhjfn", "djfhudh", "jfhshnffj", "sjdhfkskajdk"];

// ... your code

// inside of if(docs) statement
var matched_elements = [];
docs.upvotes.forEach(function(element, index, array) {
  for (var i = 0; i < my_array.length; i++) {
    if (my_array[i] == element) {
      matched_elements.push(element);
    }
  }
});
console.log(matched_elements);

【讨论】:

  • 是的,实际上我正在使用相同的方法,并且我也在实施二进制搜索以减少时间,但实际上我在想,由于我的 upvotes 数组将包含 1000 个字符串,检索这个会有什么问题从 mongo 到服务器的数据,这就是为什么我正在考虑使用单个查询,我不必在服务器端获取所有 upvotes 数组数据。
  • 我在下面发布了一个带有聚合框架的解决方案。要了解更多信息,请访问:link
  • 你能告诉我这是一种可用的方法还是我应该使用聚合一种我的意思是这是一种正确的方法还是聚合一种是??
  • @amanverma 嘿,你的意思是你只想得到一份文件吗?如果是这样,使 $match 查询更具体,即。添加“mobile_no”:“1234567890”
  • 不,我只是在问你的两个答案中我使用的是第一个,这就是为什么我只是在这两种方法中询问你认为大多数开发人员会选择哪种方法(第一个获取所有 upvotes 数组数据或第二个使用聚合)??
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 2015-02-22
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2020-03-25
相关资源
最近更新 更多