简体   繁体   中英

Mongodb complex script involving multiple collections

I'm new to mongodb and I was asked to complete a task:

Some information:

The mongodb version that is being used is 3.4.9. The script needs to be done using mongo shell.

I have two collections - 'A' and 'B'

I want to update a field in the 'A' collection if the value of a document of an array matches a field of 'B'....How can I do this?

Example:

Document in Collection 'A': _id: 1, name: john, alias:[ {name: doe}, {name: holmes} ], status: dead

Document in Collection 'B':

_id: 1, alias: doe, address: london

Basically, I need the script to loop through all the values in the 'alias.name' field of collection 'A' and reference them to the value of 'alias' in collection 'B'. If there is a match, I want to update the 'status' field in collection 'A' to 'active'. Otherwise, it should do nothing.

This script should do what you need

var docs = db.A.find({}, { alias: 1, status: 1 });

while (docs.hasNext()) {
  var currentDoc = docs.next();
  if (currentDoc.alias && currentDoc.alias.length) {
    var aliasList = currentDoc.alias.map(function(alias){
        return alias.name;
    })
    var existInB = db.B.findOne({ alias: { $in: aliasList } });
    if (existInB && existInB._id) {
      db.A.updateOne({ _id: currentDoc._id }, { $set: { status: 'active' }});
    }
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM