【问题标题】:Mongoose get docs matching the arrayMongoose 获取与数组匹配的文档
【发布时间】:2014-05-16 09:03:53
【问题描述】:

我有这样的架构

{
    members: [{
         type: Schema.Types.ObjectId,
         ref: 'User'
    }]
    createdAt: {
        type: Date,
        default: Date.now
    }
    ...
}

文档是

1-

{
    members:
    ["some id 1", "some id 2"]
},
createdAt: "someTime ago"

2-

{
    members:
    ["some id 1", "some id 2", "some id 3"]
},
createdAt: "someTime ago"

我想找到与元素数组完全匹配的文档

['some id 1', 'some id 2']

即上述示例文档中的 doc 1

这怎么可能?
任何帮助将不胜感激。

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    只要您意识到您匹配的是 ObjectId 而不是引用集合中的任何内容,您就可以使用$in 运算符:

    db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
    

    这些当然是您的实际 ObjectId 值。

    但如果你真的是指一个包含该数组的文档,那么你只需传入数组:

    db.collection.find({ "members": [ "some id 1", "some id 2" ] })
    

    如果它必须同时包含这两个元素,但可以包含其他元素,那么目前您需要使用 $and 表达式:

    db.collection.find({ "$and": [ 
        { "members": "some id 1" },
        { "members": "some id 2" } 
    ]})
    

    但从 2.6 版开始,您可以正确使用 $all 运算符来有效地执行相同的操作:

    db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
    

    另一种形式只匹配这两个元素,但顺序不限。所以有两种方法:

    db.collection.find({ "$or": [
        { "members": [ "some id 1", "some id 2" ] },
        { "members": [ "some id 2", "some id 1" ] }
    ]})
    

    这使用逻辑$or 表示数组必须是精确的,但可以以任何一种方式排列。而另一种方法:

    db.collection.find({ "$and": [ 
        { "members": "some id 1" },
        { "members": "some id 2" }
        { "members": { "$size": 2 } }
    ]})
    

    所以这将使用$size 以确保当数组包含两个匹配的元素时,它也只有两个元素。这比使用$or 更好的语法,尤其是对于较大的数组。

    如前所述,在未来的版本中,这会变得更加清晰:

    db.collection.find({ "$and": [ 
        { "members": { "$all": [ "some id 1", "some id 2" ] } },
        { "members": { "$size": 2 } }
    ]})
    

    几乎涵盖了所有的解释

    【讨论】:

    • 感谢您的回答。我会检查它
    • 此查询返回包含这些 ID 的所有文档(文档 1 和文档 2)。不是特定的文档(即上例中的 doc1)
    • @muhammedbasil 不确定我完全理解您想要哪个选项您可能想要完全匹配或使用 $and 如编辑所示。
    • 知道了 :-),非常感谢@Neil Lunn,我对 $and 方法做了一个小修改,添加了 $size。现在它返回了我想要的那个......
    • @muhammedbasil 鉴于最后的评论,我明白你现在的目标是什么。另一种方法是使用第二种形式作为数组的精确匹配,但包装在 $or 条件中,另一个参数以相反的顺序。但是,是的,将 $size 添加到 $and 以确保只有 2 个元素是一种更好的方法。我可能还会添加这两个内容,以供人们将来参考。
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 2021-08-20
    • 2017-02-19
    • 1970-01-01
    • 2019-05-06
    • 2019-07-14
    • 2021-12-06
    • 2017-08-27
    相关资源
    最近更新 更多