sql >> Database >  >> NoSQL >> MongoDB

Documenten zoeken waar een veld zich verhoudt tot een ander in een array

Je kunt nog steeds aggregate() . gebruiken hier met MongoDB 3.2, maar alleen met behulp van $redact in plaats daarvan:

db.boards.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$and": [
          { "$ne": [ "$createdBy._id", "$owner._id" ] },
          { "$setIsSubset": [["$createdBy._id"], "$acl.profile._id"] }
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

Of met $where voor de MongoDB 3.2-shell hoef je alleen maar een scoped kopie van this te bewaren , en je syntaxis was een beetje verkeerd:

db.boards.find({
  "$where": function() {
    var self = this;
    return (this.createdBy._id != this.owner._id)
      && this.acl.some(function(e) {
        return e.profile._id === self.createdBy._id
     })
  }
})

Of in een ES6-compatibele omgeving:

db.boards.find({
  "$where": function() {
    return (this.createdBy._id != this.owner._id)
      && this.acl.some(e => e.profile._id === this.createdBy._id)
  }
})

Het aggregaat is de meest performante optie van de twee en zou altijd de voorkeur moeten hebben boven het gebruik van JavaScript-evaluatie

En voor wat het waard is, de nieuwere syntaxis met $expr zou zijn:

db.boards.find({
  "$expr": {
    "$and": [
      { "$ne": [ "$createdBy._id", "$owner._id" ] },
      { "$in": [ "$createdBy._id", "$acl.profile._id"] }
    ]
  }
})

$in gebruiken in plaats van $setIsSubset waar de syntaxis iets korter is.

    return (this.createdBy._id.valueOf() != this.owner._id.valueOf())
      && this.acl.some(e => e.profile._id.valueOf() === this.createdBy._id.valueOf())



  1. socket.io broadcast-functie &Redis pub/sub-architectuur

  2. Ik ontvang dubbele berichten in mijn geclusterde node.js/socket.io/redis pub/sub-toepassing

  3. Hoe een Mongo-aggregatiequery uitvoeren in Spring Data?

  4. cappedMax werkt niet in winston-mongodb logger in Node.js op Ubuntu