MongoDB shell,$ pop很奇怪

时间:2016-08-26 12:27:29

标签: javascript arrays mongodb

我正在学习MongoDB,我决定尝试使用$ pop进行一些练习:

MongoDB Enterprise > db.produits.insert({compteur: 100001, tab:['a','b','c']})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$push: {tab: 'd'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c", "d" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$pop:{tab:1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$push:{tab:['d', 'e', 'f', 'g']}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c", [ "d", "e", "f", "g" ] ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$pop:{tab:3}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }

我不理解逻辑:

最后一个pop删除了数组中的数组,但为什么呢?

我要求弹出3,我认为它可以:

1 - 弹出选项卡内标签中的最后3个条目(所以" e"," f"和" g")

2 - 将表格弹出为单个元素,然后弹出2元素(So" b"" c")

我在这里,我不明白发生了什么:/

1 个答案:

答案 0 :(得分:1)

我不认为这是一个错误,因为这是 $pop 运算符的预期行为。它删除了数组的第一个或最后一个元素,在这种情况下,数组是一个堆栈,不会删除多个元素。所以3对1作为一个值被视为相同的(感谢@JohnnyHK这个引用)。

由于选项卡字段中的最后一项是数组,因此操作

db.produits.update({compteur: 100001}, {$pop:{tab:3}}); 

正确弹出最后一个元素(即数组)。

您正在寻找的操作可能是

db.produits.update({compteur: 100001}, {$pop:{"tab.3":-1}});

弹出嵌入数组“d”中的第一个元素,或

db.produits.update({compteur: 100001}, {$pop:{"tab.3":1}});

弹出最后一个“g”。

我想也许您正在寻找 $slice 运算符来“弹出”多个元素。