我似乎无法使用$ setIntersection来处理对象。
示例:
对象1:
[
{name: "test5", value:5},
{name: "test4", value:4},
{name: "test3", value:3},
{name: "test2", value:2}
]
对象2:
[
{name: "test5", value:5},
{name: "test422", value:422},
{name: "test333", value:3333},
{name: "test211", value:211}
]
$ setIntersection会返回我[]而不是:
[
{name: "test5', value:5}
]
如果$ setIntersection不能与Objects一起使用,有什么工作可以使用吗?
答案 0 :(得分:1)
好像你做错了:
如果我插入一个像这样的数组的对象:
db.test.insert({
"a" : [
{
"name" : "test5",
"value" : 5.0
},
{
"name" : "test4",
"value" : 4.0
},
{
"name" : "test3",
"value" : 3.0
},
{
"name" : "test2",
"value" : 2.0
}
]
})
我使用$setInsersection
运行.aggregate()
,并提供所提供的对象数组:
db.getCollection('test').aggregate([
{ "$project": {
"a": {
"$setIntersection": [
"$a",
[
{name: "test5", value: 5},
{name: "test422", value: 422},
{name: "test333", value: 3333},
{name: "test211", value: 211}
]
]
}
}}
])
然后我得到了预期的结果:
/* 1 */
{
"_id" : ObjectId("59f02df75b9b8bb266a563cb"),
"a" : [
{
"name" : "test5",
"value" : 5.0
}
]
}
如果属性“反转”,如:
db.getCollection('test').aggregate([
{ "$project": {
"a": {
"$setIntersection": [
"$a",
[
{ value: 5, name: "test5" },
{name: "test422", value: 422},
{name: "test333", value: 3333},
{name: "test211", value: 211}
]
]
}
}}
])
然后结果数组为“空”,应该是预期的,因为{ "name": "test5", "value": 5 }
与{ "value": 5, "test": name }
不同,就“集合”而言。
答案 1 :(得分:0)
您无法在此处比较两个不同文档中的数组。为此,这两个数组都需要在同一个文档中(或直接作为参数而不是字段名提供)。
$setIntersection
将两个或更多数组作为输入。它不会比较不同文档中的对象,我认为这就是你正在做的事情。
以下命令对我来说很好:
插入:
db.mycol.insert({f1:[
{name: "test5", value:5},
{name: "test4", value:4},
{name: "test3", value:3},
{name: "test2", value:2}
],f2:[
{name: "test5", value:5},
{name: "test422", value:422},
{name: "test333", value:3333},
{name: "test211", value:211}
]})
<强>输出:强>
WriteResult({ "nInserted" : 1 })
汇总:
db.mycol.aggregate([{$project:{com:{$setIntersection:["$f1","$f2"]}}}])
输出
{ "_id" : ObjectId("59f02eba7f11fa2e1df15e53"), "com" : [ { "name" : "test5", "value" : 5 } ] }