MongoDB为另一个集合中的每个文档插入一个文档

时间:2016-02-29 16:13:38

标签: mongodb collections mongodb-query document mongodb-update

我有一个包含一些文档的集合(users):

{
    _id: ObjectId("56d45406be05db4022be51f9"),
    morecontent : ""
},
{
    _id: ObjectId("56d45406be05db3021be32e3"),
    morecontent : ""
}

我想为user集合中的每个条目创建一个新文档。 文档将从通知对象创建,如下所示:

{
    type: 'alert',
    msg: 'This is important'
}

集合notifications应如下所示:

{
    _id: ObjectId("56d45406be05db3021bf20a1"),
    someoldcontent: "This was here before the request"
},
{
    _id : ObjectId("56d45406be05db4022be20b1"),
    user: ObjectId("56d45406be05db4022be51f9"),
    type: 'alert',
    msg: 'This is important'
},
{
    _id : ObjectId("56d45406be05db3021be32e3"),
    user: ObjectId("56d45406be05db3021be32e3"),
    type: 'alert',
    msg: 'This is important'
}

有没有办法在mongodb请求中执行此操作?

2 个答案:

答案 0 :(得分:2)

感谢professor79帮助我解决了很多问题。

经过大量努力,找到了查询。我们使用聚合框架才能成功。

所需的仅有2个聚合是$project$out$out会自动处理_id文档中的新notification

鉴于这个名为user的集合:

{
    _id: ObjectId("56d45406be05db4022be51f9"),
    morecontent : ""
},
{
    _id: ObjectId("56d45406be05db3021be32e3"),
    morecontent : ""
}

我们希望为msg集合中的每个文档创建包含相同typeuser字段的通知。 每个通知都会放在notifications集合中,并将作为对应userId的参考。

以下是实现此类结果的查询:

db.user.aggregate([{$project: { "userId": "$_id", type: {"$literal" : "danger"}, "msg": {"$literal": "This is a message"}}}, {$out : "notifications"}])

notifications集合中的输出:

{
    "_id" : ObjectId("56d6112e197b4ea11a87de1a"),
    "userId" : ObjectId("56d45406be05db4022be51f9"),
    "type" : "danger",
    "msg" : "This is a message"
}
{
    "_id" : ObjectId("56d6112e197b4ea11a87de1b"),
    "userId" : ObjectId("56d45406be05db3021be32e3"),
    "type" : "danger",
    "msg" : "This is a message"
}

答案 1 :(得分:1)

由于我们有一些聊天来澄清问题:

执行此操作服务器端需要执行以下步骤:

  
      
  1. 第一步 - 匹配>获得用户ID
  2.   
  3. 根据需要将项目标识为新文档
  4.   
  5. out - >在通知集合中存储输出
  6.