【问题标题】:Mongoose - Get all elements where id in nested array/Dynamically generated $and clausesMongoose - 获取嵌套数组中 id 的所有元素/动态生成的 $and 子句
【发布时间】:2014-02-13 01:39:05
【问题描述】:

我有一个小问题。

我想检索 id 在给定数组中的集合中的所有元素。这是我能做到的。问题是,id 必须存在于多个数组中(而且我事先不知道有多少)。

所以你有

Test.find({
  $and: [
      { $in: blabla },
      ...
  ]

}

问题是我可以有多个 $in 子句,当我调用函数时我不知道有多少。有没有办法动态指定这个? (它只是一个包含 id 的数组数组,如果每个数组中都存在 id,则返回元素)。

【问题讨论】:

  • 你能举三个文件的例子吗?那么我的答案可能会更具体。
  • 好的,我会在今天晚些时候发布一个

标签: javascript node.js mongodb mongoose


【解决方案1】:

以编程方式构建您的 $and 查询对象以包含您需要的所有数组:

var arrayOfArrays = [[...], [...], ...];
var query = { $and: [] };
for (var i=0; i<arrayOfArrays.length; ++i) {
    query.$and.push({ _id: {$in: arrayOfArrays[i]} });
}
MyModel.find(query, function(err, docs) {...});

或者您可以使用map 更简洁:

var query = { $and: arrayOfArrays.map(function(item) { return {$in: item}; }) };
MyModel.find(query, function(err, docs) {...});

【讨论】:

  • 我将对此进行测试,但乍一看,这似乎可以而且应该对我有用。
  • @KWyckmans:你说I do not know how many when I call the function那么你如何构建查询对象?
  • 我可以遍历它。如果你愿意,我会发布我的解决方案示例?
【解决方案2】:

您唯一的机会是使用$where

【讨论】:

    【解决方案3】:

    您可以使用聚合框架,更具体地说是 $unwind 方法来完成此操作。

    假设您有一个看起来像这样的文档

    {
      arrayOfStuff: [
        [1,2,3],
        [4,5,6],
        [7,8,9]
      ]
    }
    

    然后你可以运行

    db.collection.aggregate({$unwind:'$arrayOfStuff'},{$match: {arrayOfStuff: 9}})
    

    【讨论】:

    • 但他说有多个数组,他不知道有哪些,有多少......
    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多