如何将MongoDB中的元素数组添加到现有文档中的数组中?

时间:2016-04-22 15:11:23

标签: mongodb mongodb-query

在MongoDB中,我尝试编写查询以将数组中的元素添加到现有文档中,而不是将元素添加为对象:

@ConditionalOnProperty(name="server.host", havingValue="localhost")

元素正在添加为

property: ObjectID(xxx)

如果我的术语错了,请原谅我。我对MongoDB来说是全新的;我通常只使用关系数据库。如何正确添加这些新元素?

我有一个名为拍卖的集合,它有两个字段:ID和属性。 Properties是一个名为property的对象数组。以下是两个拍卖文件的示例:

**我更改了对象ID,以便在讨论中更容易引用

ObjectID(xxx)

我想在拍卖中添加3个新属性" abc"。我该怎么做?

这是我尝试过的:

我有一系列属性,如下所示:

Collection db.auctions
{
    "_id" : ObjectId("abc"),
    "properties" : [
        {
            "property" : ObjectId("prop1")
        }, 
        {
            "property" : ObjectId("prop2")
        }, 
        {
            "property" : ObjectId("prop3")
        }]
}
{
    "_id" : ObjectId("def"),
    "properties" : [
        {
            "property" : ObjectId("prop97")
        }, 
        {
            "property" : ObjectId("prop98")
        }]
}

我写了一个更新查询,将这些属性推送到拍卖中的属性数组中:

Array PropsToAdd
[
    ObjectId("prop4"), 
    ObjectId("prop5"), 
    ObjectId("prop6")
]

此查询给出了以下结果。请注意,它不是使用我的数组中的值添加名为property的元素,而是从我的数组中添加了我的值。我显然需要添加"属性"部分,但我该怎么做?

db.auctions.update(
    {"_id": "abc"}
    ,
    { $push: { properties: { $each: PropsToAdd } } } 
);

我正在寻找的结果是:

Collection db.auctions (_id "abc" only)
    {
    "_id" : ObjectId("abc"),
    "properties" : [
        {
            "property" : ObjectId("prop1")
        }, 
        {
            "property" : ObjectId("prop2")
        }, 
        {
            "property" : ObjectId("prop3")
        }, 
        ObjectId("prop4"), 
        ObjectId("prop5"), 
        ObjectId("prop6"), 
        ObjectId("prop7")]
}

以下是我正在添加的属性数组的更多信息。我通过运行这些查询得到它。也许其中一个需要改变?

此查询获取当前属性的数组:

Collection db.auctions (_id "abc" only)
{
    "_id" : ObjectId("abc"),
    "properties" : [
        {
            "property" : ObjectId("prop1")
        }, 
        {
            "property" : ObjectId("prop2")
        }, 
        {
            "property" : ObjectId("prop3")
        }, 
        {
            "property" : ObjectId("prop4")
        },
        {
            "property" : ObjectId("prop5")
        },         
        {
            "property" : ObjectId("prop6")
        } 
}

然后,这些结果用于查找旧文件中不属于旧文件的属性:

var oldActiveProperties = db.properties.distinct( "saleNumber", { "active": true, "auction": ObjectId("abc") } );

生成的数组是我需要添加到拍卖系列中的。

1 个答案:

答案 0 :(得分:3)

使用JavaScript的原生 map() 方法将数组映射到文档数组中。以下显示了这一点:

var PropsToAdd = db.newProperties.distinct("_id", 
    { "saleNumber": { "$nin": oldActiveProperties }, "active": true}
).map(function (p) { return { property: p }; });

db.auctions.update(
    {"_id": "abc"},
    { $push: { "properties": { "$each": PropsToAdd } } } 
);