Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 是否只有在满足条件的情况下才有办法将子文档推入mongodb数组?_Arrays_Node.js_Mongodb_Subdocument - Fatal编程技术网

Arrays 是否只有在满足条件的情况下才有办法将子文档推入mongodb数组?

Arrays 是否只有在满足条件的情况下才有办法将子文档推入mongodb数组?,arrays,node.js,mongodb,subdocument,Arrays,Node.js,Mongodb,Subdocument,我正在将子文档推入数组中。 基本上,子文档是这样的: { id:"someId", date:Date } 我只想在没有其他子文档具有匹配id的情况下添加新子文档。我在mongodb文档中找到了$addToSet修饰符,但我不确定它是否可以只检查子文档中的一个键,而不是将整个数组项与另一个进行比较。 是否有任何方法可以在单个查询中执行此操作,或者我应该使用两个查询?您可以在单个原子更新操作中执行此操作。假设您的收藏包含以下文档: Mongo shell db.test.insert([

我正在将子文档推入数组中。 基本上,子文档是这样的:

{
  id:"someId",
  date:Date
}
我只想在没有其他子文档具有匹配id的情况下添加新子文档。我在mongodb文档中找到了
$addToSet
修饰符,但我不确定它是否可以只检查子文档中的一个键,而不是将整个数组项与另一个进行比较。
是否有任何方法可以在单个查询中执行此操作,或者我应该使用两个查询?

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

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中的以下update语句将通过将新的子文档
{“id”:3,“date”:new date()}
添加到
items
数组中,来更新具有
items
子文档但没有
id
键的文档:

db.test.update(
    { "items.id": { "$exists": false } },
    {
        "$push": {
            "items": { "id": 3, "date": new Date() }
        }
    }
)
查询测试集合

> 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的子文档时添加新子文档,只需执行一次更新操作即可指定匹配条件 在更新查询文档中

由于现有文档中没有匹配的数组元素,因此以下更新操作将向数组中添加id为4的子文档:

db.test.update(
    { "items.id": { "$ne": 4 } },
    {
        "$push": {
            "items": { "id": 4, "date": new Date() }
        }
    }
)
对于独占更新,如果存在id字段且给定id不匹配,则只需添加子文档,然后将条件与相等性检查一起包括:

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

我说的是只有在没有匹配的情况下才能进入阵列id@nikoss这在这里被认为是一个坏习惯,所以你改变问题的方式;我只想在id不存在时添加新的子文档。与我只想在没有其他子文档具有匹配id时添加新子文档完全不同。上面的答案直接解决了原始问题,我只想在id不存在时添加新子文档。