Mongoose获取与数组匹配的文档

13

我有一个这样的结构

{
    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']

在上面的示例文档中,ie doc 1是什么意思?

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

1个回答

35
只要您意识到匹配的是 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 } }
]})

那基本上涵盖了所有的解释。

谢谢您的回答。我会检查它。 - Muhammed Basil
该查询返回包含这些ID的所有文档(doc1和doc2),而不是特定的文档(即在上面的示例中,doc1)。 - Muhammed Basil
@muhammedbasil,我不确定我完全理解你想要哪个选项,你可能想要一个精确匹配或者像编辑中所示的使用$and。 - Neil Lunn
明白了 :-),非常感谢 @Neil Lunn,我对 $and 方法进行了小修改,添加了 $size。现在它返回了我想要的精确结果... - Muhammed Basil
1
@muhammedbasil,我现在明白你的意图了,考虑到最后一条评论。另一种方法是使用第二个形式作为数组的精确匹配,但将其包装在$or条件中,并以相反的顺序添加其他参数。但是,是的,在$and中添加$size以确保只有2个元素是更好的方法。我可能会将它们都添加到其中,以供将来参考。 - Neil Lunn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接