MongoDB обновляет поле, только если курсор имеет поле - PullRequest
1 голос
/ 29 марта 2019

Я обновляю документ MongoDB, используя цикл курсора.Но в приведенном ниже курсоре запроса поле owner не может существовать в результатах.Я использую приведенный ниже запрос, но похоже, что results.hasOwnProperty ('owner') всегда возвращает true и выдает ошибку results.owner не существует.

Даже я пытался db.contact_coolection.find ({"_ id": ObjectId (" 5b876144d87b4d06ecb571b8 ")}) -> Это дает ownerCRMContactId. $ Cond недопустимо.

Я думаю, что $ cond является оператором-агрегатором, что в этом случае следует использовать?

db.contact_coolection.find().forEach(function(results)
{    
    print( "Id: " + results._id);
    db.contact_coolection.update( {_id : results._id},
    {$set : {
        "ownerCRMContactId": {
                 $cond: { if: results.hasOwnProperty('owner'), then: results.owner.$id, else: '' }
               }
        }
     });
});

Ниже приведен образец документа, не содержащий владельца

{
    "_id" : ObjectId("5b876144d87b4d06ecb571b8"),
    "_class" : "com.cfcf.crm.model.auth.CRMContact",
    "crmId" : -09898,
    "prefix" : "Mr",
    "firstName" : "fghh",
    "middleName" : "asdgasd",
    "lastName" : "asdasd",
    "suffix" : "asdassd",
    "nickName" : "asdasd",
    "gender" : "Male",
    "age" : "0",
    "dlNumber" : "0",
    "height" : 0,
    "weight" : 0,
    "isSmoker" : false,
    "deleted" : false,
    "isEnabled" : false,
    "externalSource" : [],
    "familyMembers" : [],
    "crmInfos" : [ 
        {
            "opportunityId" : "5b95fa6c28e76b60c0454a2e"
        }
    ],
    "createdDate" : ISODate("2018-08-30T03:15:16.181Z"),
    "lastModifiedDate" : ISODate("2018-09-10T05:00:28.627Z"),
    "createdBy" : "5b2f43e433d58d3e0cd15304",
    "lastModifiedBy" : "5b2f43e433d58d3e0cd15304",
    "owner" : {
        "$ref" : "contact_coolection",
        "$id" : ObjectId("5b2f43e433d58d3e0cd15303")
    },
    "roles" : [],
    "links" : [ 
        {
            "linkId" : 0,
            "linkTitle" : "testsLinkss",
            "linkUrl" : "www.google.com"
        }
    ],
    "addresses" : [ 
        {
            "addressLine1" : "3rd Cross",
            "addressLine2" : "Kensington Street",
            "city" : "Birmingham",
            "state" : "Alabama",
            "country" : "US"
        }
    ]
}

1 Ответ

2 голосов
/ 29 марта 2019

Вы можете сделать это следующим образом

const promises = db.contact_coolection.find().forEach(async(results) => {
  print( "Id: " + results._id);
  await db.contact_coolection.update(
    { _id: results._id },
    { $set: {
      ownerCRMContactId: results.owner ? results.owner.$id : ''
    }}
  )
})

await Promise.all(promises)

Обновить

const promises = db.contact_coolection.find().forEach(async(results) => {
  print( "Id: " + results._id);
  await db.contact_coolection.update(
    { _id: results._id },
    { $set: {
      ownerCRMContactId: (results && results.owner) ? results.owner.$id : ''
    }}
  )
})

await Promise.all(promises)
...