除了我们传递的元素之外,如何在mongoose / mongodb中获取数组中的元素?

时间:2015-04-30 07:22:01

标签: node.js mongodb mongoose

以下是集合Conversations的文档结构。 它包含一个对象的参与者数组,该对象位于消息数组中。 Messages数组包含几个消息对象,如下所示:

{
  "_id": "5540b34347fdd4e917b80aa4",
  "messages": [{
    "from": "5530af38576214dd3553331c",
    "_id": "5540d5dc22f922061f68a41d",
    "participants": ["5530af38576214dd3553331c", "553f280040d50ef20f8c9d66"]
  }]
}

这里我有messages.from数据,我希望从messages.participants数组中获取元素,除了messages.from元素。

在上面的例子中from5530af38576214dd3553331c。所以我必须从553f280040d50ef20f8c9d66数组中获取元素messages.participants

上面有几个文件,我们必须为每个文件做同样的事情。

我怎样才能在moongoose / mongodb中做到这一点?

2 个答案:

答案 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比较类似于严格的相等比较,例如: ===,但NaNNaN匹配。

所以你可以尝试以下方法:

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