Node.js Mongoose获取与数组匹配的文档

Node.js Mongoose获取与数组匹配的文档,node.js,mongodb,mongoose,mongodb-query,Node.js,Mongodb,Mongoose,Mongodb Query,我有一个这样的模式 { members: [{ type: Schema.Types.ObjectId, ref: 'User' }] createdAt: { type: Date, default: Date.now } ... } 这些文件是 一,- 二,- 我想找到与元素数组完全匹配的文档 ['some id 1', 'some id 2'] 上述样本文件中的ie文件1 这怎

我有一个这样的模式

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

这些文件是

一,-

二,-

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

['some id 1', 'some id 2']
上述样本文件中的ie文件1

这怎么可能呢?

任何帮助都将不胜感激。

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

db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
当然,这些是您的实际ObjectId值

但是,如果您真正指的是一个正好具有该数组的文档,那么您只需传入该数组:

db.collection.find({ "members": [ "some id 1", "some id 2" ] })
如果它必须同时包含这两个元素,但可以包含其他元素,则当前需要使用表达式:

db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" } 
]})
但从病房2.6版开始,您可以正确使用操作员有效地执行以下操作:

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" ] }
]})
这使用了一种逻辑方法来表示数组必须精确,但可以任意排列。另一种方法是:

db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" }
    { "members": { "$size": 2 } }
]})
因此,这将用于确保当数组包含匹配的两个元素时,也只有两个元素。这是一种比使用更好的语法,尤其是对于较大的数组

在以后的版本中,如前所述,这会变得更干净:

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

这几乎涵盖了所有的解释

谢谢你的回答。我将检查它。此查询将返回包含这些ID的所有文档(文档1和文档2)。不是特定的doc(即在上面的示例中,doc1)@muhammedbasil不确定我是否完全理解您想要的选项您可能想要精确匹配或使用$,如编辑中所示。明白了:-),非常感谢@Neil Lunn,我对$和方法做了一个小的修改,添加了$大小。现在它返回的正是我想要的…@muhammedbasil我明白你现在的目标了,考虑到最后的评论。另一种方法是使用第二种形式作为数组上的精确匹配,但以$or条件包装,另一个参数的顺序相反。但是,将$size添加到$size并确保只有两个元素是一种更好的方法。我可能会把这两个都加上,以供人们将来参考。
db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" }
    { "members": { "$size": 2 } }
]})
db.collection.find({ "$and": [ 
    { "members": { "$all": [ "some id 1", "some id 2" ] } },
    { "members": { "$size": 2 } }
]})