MongoDB中的$ nin的非严格行为

在MongoDB中是否有非严格的$ nin版本? 例如

假设我们有一个名为User的模型和一个名为Task的Model

var TaskSchema = new Schema({ user_array: [{user: Schema.ObjectId}], }); 

一个快速的例子就是这个

 task1 : [user1, user2, user4, user7] task2 : [user2, user 5, user7] 

如果我有一个用户列表

 [user1, user7] 

我想select在user_array重叠最less的任务,在这种情况下task2,我知道$ nin严格返回任务包含user1或user7,但我想知道是否有操作$ nin是非严格。

另外,我可以为我写一个DPfunction

任何意见,将不胜感激

谢谢

那么在MongoDB 2.6及更高版本中,您可以使用$setIntersection$size操作符,因此您可以像这样执行.aggregate()语句:

 db.collection.aggregate([ { "$project": { "user_array": 1, "size": { "$size": { "$setIntersection": [ "$user_array", [ "user1", "user7" ] ] }} }}, { "$match": { "size": { "$gt": 1 } }, { "$sort": { "size": 1 }}, { "$group": { "_id": null "user_array": { "$first": "$user_array" } }} ]) 

所以这些操作员帮助减less了find最less匹配文档所需的步骤。

基本上, $setIntersection将数组中的匹配元素返回到与之比较的元素。 $size运算符返回结果数组的“大小”。 因此,稍后用$match过滤出数组中找不到匹配列表中的任何项目的任何文档。

最后,你只需sorting并返回与“最less”匹配的项目。

但是仍然可以在更早的版本中使用更多的步骤来完成。 所以基本上你的“非严格”实现变成$or条件。 但是,当然你仍然需要计算匹配:

 db.collection.aggregate([ { "$project": { "_id": { "_id": "$_id", "user_array": "$user_array" }, "user_array": 1 }} { "$unwind": "$user_array" }, { "$match": { "$or": [ { "user_array": "user1" }, { "user_array": "user7" } ] }}, { "$group": { "_id": "$_id", "size": { "$sum": 1 } }}, { "$sort": { "size": 1 } }, { "$group": { "_id": null, "user_array": { "$first": "$_id.user_array" } }} ]) 

那样做也是一样的