XPath и Выбор единственного узла

Вы можете использовать:

db.foo.update({}, {$rename:{"name.additional":"name.last"}}, false, true);

Или просто обновить документы, которые содержат это свойство:

db.foo.update({"name.additional": {$exists: true}}, {$rename:{"name.additional":"name.last"}}, false, true);

В вышеприведенном методе false, true: { upsert:false, multi:true }. Вам нужно multi:true обновить все ваши записи.

Или вы можете использовать предыдущий способ:

remap = function (x) {
  if (x.additional){
    db.foo.update({_id:x._id}, {$set:{"name.last":x.name.additional}, $unset:{"name.additional":1}});
  }
}

db.foo.find().forEach(remap);

В MongoDB 3.2 вы также можете использовать

db.students.updateMany( {}, { $rename: { "oldname": "newname" } } )

Общий синтаксис этого:

db.collection.updateMany(filter, update, options)

https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/

11
задан buræquete 28 April 2017 в 12:33
поделиться

4 ответа

// в начале выражения XPath начинает с корня документа. Попробуйте ".//stuffChild".. сокращение от сам:: узел (), который установит контекст для поиска, и//, является сокращением от порожденной оси.

Таким образом, Вы имеете:

XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild");

который переводит в:

xmlNode stuffChild = материал. SelectSingleNode ("сам:: узел () / потомок:: stuffChild");

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild");

В случае, где дочерний узел мог иметь то же имя как родитель, Вы захотите использовать немного больше подробного синтаксиса, который следует, чтобы гарантировать, чтобы Вы не делали повторного выбора родитель:

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");

Также обратите внимание, что, если "stuffChild" является прямым потомком "материала", можно полностью опустить префиксы и просто выбрать "stuffChild".

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");

Учебное руководство W3Schools имеет полезную информацию в легком для переваривания формата.

10
ответ дан 3 December 2019 в 09:21
поделиться

Если "stuffChild" является дочерним узлом "материала", то Ваш xpath должен просто быть:

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
1
ответ дан 3 December 2019 в 09:21
поделиться

// Вы используете перед stuffChild средства Вы ищете stuffChild элементы, начинающие с корня.

Если Вы хотите начать с текущего узла (потомки текущего узла), необходимо использовать .//, как в:

stuff.SelectSingleNode(".//stuffChild");
2
ответ дан 3 December 2019 в 09:21
поделиться

Выбор единственного узла означает необходимость только в первом элементе. Так, лучшее решение:

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");
-1
ответ дан 3 December 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: