以下是集合Conversations
的文档结构。
它包含一个对象的参与者数组,该对象位于消息数组中。 Messages数组包含几个消息对象,如下所示:
{
"_id": "5540b34347fdd4e917b80aa4",
"messages": [{
"from": "5530af38576214dd3553331c",
"_id": "5540d5dc22f922061f68a41d",
"participants": ["5530af38576214dd3553331c", "553f280040d50ef20f8c9d66"]
}]
}
这里我有messages.from
数据,我希望从messages.participants
数组中获取元素,除了messages.from
元素。
在上面的例子中from
是5530af38576214dd3553331c
。所以我必须从553f280040d50ef20f8c9d66
数组中获取元素messages.participants
。
上面有几个文件,我们必须为每个文件做同样的事情。
我怎样才能在moongoose / mongodb中做到这一点?
答案 0 :(得分:0)
Mongo aggregation和$unwind用于检查您的条件是否与查询后匹配检查:
db.collectionName.aggregate({
"$unwind": "$messages" // first unwind messages array
}, {
"$match": {
"messages.from": "5530af38576214dd3553331c" //match critreia
}
}, {
"$unwind": "$messages.participants" // unwind participants array
}, {
"$match": {
"messages.participants": {
"$ne": "5530af38576214dd3553331c" // check messages.from not equals participants array
}
}
}, {
"$project": {
"_id": 0,
"participants": "$messages.participants"
}
}).pretty()
答案 1 :(得分:0)
您可以使用lodash库的一种方法,特别是您需要difference方法。这将使用SameValueZero
创建一个排除所提供数组的所有值的数组,以进行相等比较。注意:SameValueZero
比较类似于严格的相等比较,例如: ===
,但NaN
与NaN
匹配。
所以你可以尝试以下方法:
Conservations.where("_id": "5540b34347fdd4e917b80aa4")
.select({"messages": { "$elemMatch": {"from": "5530af38576214dd3553331c"}})
.exec(function (err, docs){
var set_difference = _.difference(["5530af38576214dd3553331c"], docs[0].messages.participants);
console.log(set_difference); // => ["553f280040d50ef20f8c9d66"]
});