2016-04-22 61 views
2

在MongoDB中,我想編寫一個查詢從數組中元素添加到現有的文檔,但不是添加元素作爲對象:如何將MongoDB中的元素數組添加到現有文檔中的數組中?

property: ObjectID(xxx) 

的元素越來越添加只是

ObjectID(xxx) 

原諒我,如果我得到的術語錯了。我對MongoDB完全陌生;我通常只使用關係數據庫。我如何正確添加這些新元素?

我有一個叫做拍賣的集合,它有兩個字段:ID和屬性。屬性是一個名爲property的對象數組。這裏有兩個拍賣文件的例子:

**我改變了對象ID,使他們更容易在我們的討論

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

我想增加3個新特性拍賣「ABC」引用。我該怎麼做呢?

這裏是我的嘗試:

我有屬性的數組,看起來像這樣:

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

我寫了一個更新查詢拍賣推動這些屬性到屬性數組:

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

此查詢結果如下。注意,不是從我的數組中添加名爲property的元素,而是從我的數組中添加我的值。我顯然需要添加「屬性」部分,但我該怎麼做?

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

然後這些結果被用來找到那些不舊文件中新的文件屬性:

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

產生的陣列是我需要添加到拍賣集合。

回答

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 } } } 
); 
+0

這很好,謝謝!就像我說的,我是MongoDB的新手。我正在使用MongoChef來編寫查詢。在編寫查詢時是否可以使用大部分JavaScript函數? – boilers222

+0

MongoDB使用JavaScript引擎[SpiderMonkey](https://developer.mozilla。org/en-US/docs/Mozilla/Projects/SpiderMonkey)的[mongo](https://docs.mongodb.org/manual/reference/program/mongo/#bin.mongo)shell和服務器端[mongod](https://docs.mongodb.org/manual/reference/program/mongod/#bin.mongod)中的javascript,因此在mongo shell中編寫查詢時api可用,儘管與MongoDB的大多數交互都不使用JavaScript但在交互應用程序的語言中使用[慣用驅動程序](https://docs.mongodb.org/manual/applications/drivers/)。 – chridam

相關問題