有没有办法在满足条件的情况下将子文档推送到mongodb数组?

时间:2016-05-23 09:19:57

标签: arrays node.js mongodb subdocument

我将子文档推送到数组中。 基本上,subdocs是这样的:

{
  id:"someId",
  date:Date
}

我想添加新的subdoc只有在没有其他带有匹配id.I的文件时才会在mongodb文档中找到$addToSet修饰符但是我不确定它是否只能检查子文档中的键而不是comparin整个数组项目到另一个。 有没有办法在单个查询中执行此操作,或者无论如何我应该使用2个查询?

1 个答案:

答案 0 :(得分:1)

您可以在单个原子更新操作中执行此操作。假设您的收藏集包含以下文件:

Mongo shell

db.test.insert([
    { 
        "_id": 1,
        "items": [
            { "id": 1, "date": new Date("2016-05-20") },
            { "id": 2, "date": new Date("2016-05-21") }
        ]
    },
    { 
        "_id": 2,
        "items": [
            { "date": new Date("2016-05-22") }
        ]
    }
])

然后,mongo shell中的以下更新语句将通过向{{{{}}添加新的子文档items来更新具有id子文件但没有{ "id": 3, "date": new Date() }密钥的文档。 1}}数组:

items

查询测试集合

db.test.update(
    { "items.id": { "$exists": false } },
    {
        "$push": {
            "items": { "id": 3, "date": new Date() }
        }
    }
)

要仅在没有其他具有匹配id的子网时添加新的子网,您只需要一个更新操作,您可以在其中指定匹配条件 在更新查询文档中。

以下更新操作将向数组添加一个带有> db.test.find().pretty() { "_id" : 1, "items" : [ { "id" : 1, "date" : ISODate("2016-05-20T00:00:00Z") }, { "id" : 2, "date" : ISODate("2016-05-21T00:00:00Z") } ] } { "_id" : 2, "items" : [ { "date" : ISODate("2016-05-22T00:00:00Z") }, { "id" : 3, "date" : ISODate("2016-05-23T09:33:15.913Z") } ] } 的子文档,因为现有文档中没有匹配的数组元素:

id = 4

对于只想添加子文档的独占更新,如果存在id字段并且给定的id不匹配,则将条件与相等性检查一起包括:

db.test.update(
    { "items.id": { "$ne": 4 } },
    {
        "$push": {
            "items": { "id": 4, "date": new Date() }
        }
    }
)