gpt4 book ai didi

node.js - mongodb 中 $nin 的非严格行为

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:06 24 4
gpt4 key购买 nike

mongodb 中有非严格的 $nin 版本吗?例如

假设我们有一个名为“用户”的模型和一个名为“任务”的模型

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

一个快速示例是这样的

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

如果我有用户列表

[user1, user7]

我想选择user_array中重叠最少的任务,在本例中为task2,我知道$nin严格返回既不包含user1也不包含user7的任务,但我想知道是否有操作$ nin 并不严格。

或者,我可以为此编写一个 DP 函数

如有任何建议,我们将不胜感激

谢谢

最佳答案

在 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" }
}}
])

因此,这些运算符有助于减少查找最不匹配文档所需的步骤。

基本上是$setIntersection将数组中的匹配元素返回到与其进行比较的元素。 $size运算符返回结果数组的“大小”。因此,稍后您可以使用 $match 过滤掉数组中未找到匹配列表中的任何项目的任何文档。

最后,您只需排序并返回具有“最少”匹配项的项目。

但在早期版本中仍然可以通过更多步骤来完成。所以基本上你的“非严格”实现变成了 $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" }
}}
])

这会做同样的事情。

关于node.js - mongodb 中 $nin 的非严格行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23027569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com